Obtener índices de las filas que se cruzan de Numpy 2d Array

Quiero obtener los índices de las filas que se cruzan de una matriz 2d numpy principal A, con otra B.

A=array([[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]]) B=array([[1, 4], [1, 2], [5, 6], [6, 3]]) result=[0,2] 

Donde esto debería devolver [0,2] basado en los índices de la matriz A.

¿Cómo se puede hacer esto de manera eficiente para matrices 2d?

¡Gracias!

editar

He probado la función:

 k[np.in1d(k.view(dtype='i,i').reshape(k.shape[0]),k2.view(dtype='i,i'). reshape(k2.shape[0]))] 

de la implementación de numpy in1d para matrices 2D? pero me da un error de remodelación. Mi tipo de datos es flotante (con dos decimales). Por otra parte, también probé con sets pero el rendimiento es bastante lento.

Con cambios mínimos, puede hacer que su enfoque funcione:

 In [15]: A Out[15]: array([[ 1, 2], [ 3, 4], [ 5, 6], [ 7, 8], [ 9, 10]]) In [16]: B Out[16]: array([[1, 4], [1, 2], [5, 6], [6, 3]]) In [17]: np.in1d(A.view('i,i').reshape(-1), B.view('i,i').reshape(-1)) Out[17]: array([ True, False, True, False, False], dtype=bool) In [18]: np.nonzero(np.in1d(A.view('i,i').reshape(-1), B.view('i,i').reshape(-1))) Out[18]: (array([0, 2], dtype=int64),) In [19]: np.nonzero(np.in1d(A.view('i,i').reshape(-1), B.view('i,i').reshape(-1)))[0] Out[19]: array([0, 2], dtype=int64) 

Si sus arreglos no son flotantes, y ambos son contiguos, entonces lo siguiente será más rápido:

 In [21]: dt = np.dtype((np.void, A.dtype.itemsize * A.shape[1])) In [22]: np.nonzero(np.in1d(A.view(dt).reshape(-1), B.view(dt).reshape(-1)))[0] Out[22]: array([0, 2], dtype=int64) 

Y un tiempo rápido:

 In [24]: %timeit np.nonzero(np.in1d(A.view('i,i').reshape(-1), B.view('i,i').reshape(-1)))[0] 10000 loops, best of 3: 75 µs per loop In [25]: %timeit np.nonzero(np.in1d(A.view(dt).reshape(-1), B.view(dt).reshape(-1)))[0] 10000 loops, best of 3: 29.8 µs per loop 

Puede usar los objetos np.char.array() para hacer esta comparación usando np.in1d() :

 s1 = np.char.array(A[:,0]) + '-' + np.char.array(A[:,1]) s2 = np.char.array(B[:,0]) + '-' + np.char.array(B[:,1]) np.where(np.in1d(s1, s2))[0] #array([0, 2], dtype=int64) 

NOTA : A y B deben ser del mismo tipo de datos ( int , float , etc.) para que esto funcione.