Numpy elemento-sabio en la operación

Supongamos que tengo un vector de columna y con longitud n, y tengo una matriz X de tamaño n * m. Quiero verificar cada elemento i en y, si el elemento está en la fila correspondiente en X. ¿Cuál es la forma más eficiente de hacer esto?

Por ejemplo:

y = [1,2,3,4].T y

 X =[[1, 2, 3],[3, 4, 5],[4, 3, 2],[2, 2, 2]] 

Entonces la salida debería ser

 [1, 0, 1, 0] or [True, False, True, False] 

lo que sea más fácil

Por supuesto, podemos usar un bucle for para iterar a través de y y X, pero ¿hay alguna forma más eficiente de hacerlo?

Enfoque vectorizado utilizando la broadcasting .

 ((X == y[:,None]).any(1)).astype(int) 

Ejecución de la muestra

 In [41]: X # Input 1 Out[41]: array([[1, 2, 3], [3, 4, 5], [4, 3, 2], [2, 2, 2]]) In [42]: y # Input 2 Out[42]: array([1, 2, 3, 4]) In [43]: X == y[:,None] # Broadcasted comparison Out[43]: array([[ True, False, False], [False, False, False], [False, True, False], [False, False, False]], dtype=bool) In [44]: (X == y[:,None]).any(1) # Check for any match along each row Out[44]: array([ True, False, True, False], dtype=bool) In [45]: ((X == y[:,None]).any(1)).astype(int) # Convert to 1s and 0s Out[45]: array([1, 0, 1, 0])