获取Numpy 2d Array的相交行的索引

Yan*_*ael 6 python arrays numpy

我想得到一个主numpy 2d数组A的交叉行的索引,另一个是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]
Run Code Online (Sandbox Code Playgroud)

这应该根据数组A的索引返回[0,2].

如何有效地为二维阵列完成这项工作?

谢谢!

编辑

我试过这个功能:

k[np.in1d(k.view(dtype='i,i').reshape(k.shape[0]),k2.view(dtype='i,i').
reshape(k2.shape[0]))]
Run Code Online (Sandbox Code Playgroud)

numpy in1d实现二维数组?但我得到了一个重塑错误.我的数据类型是浮点数(带有两位小数).此外,我也试过套装,但性能很慢.

Jai*_*ime 5

只需进行最少的更改,您就可以让您的方法发挥作用:

\n\n
In [15]: A\nOut[15]: \narray([[ 1,  2],\n       [ 3,  4],\n       [ 5,  6],\n       [ 7,  8],\n       [ 9, 10]])\n\nIn [16]: B\nOut[16]: \narray([[1, 4],\n       [1, 2],\n       [5, 6],\n       [6, 3]])\n\nIn [17]: np.in1d(A.view('i,i').reshape(-1), B.view('i,i').reshape(-1))\nOut[17]: array([ True, False,  True, False, False], dtype=bool)\n\nIn [18]: np.nonzero(np.in1d(A.view('i,i').reshape(-1), B.view('i,i').reshape(-1)))\nOut[18]: (array([0, 2], dtype=int64),)\n\nIn [19]: np.nonzero(np.in1d(A.view('i,i').reshape(-1), B.view('i,i').reshape(-1)))[0]\nOut[19]: array([0, 2], dtype=int64)\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果您的数组不是浮点数,并且都是连续的,那么以下方法会更快:

\n\n
In [21]: dt = np.dtype((np.void, A.dtype.itemsize * A.shape[1]))\n\nIn [22]: np.nonzero(np.in1d(A.view(dt).reshape(-1), B.view(dt).reshape(-1)))[0]\nOut[22]: array([0, 2], dtype=int64)\n
Run Code Online (Sandbox Code Playgroud)\n\n

并快速计时:

\n\n
In [24]: %timeit np.nonzero(np.in1d(A.view('i,i').reshape(-1), B.view('i,i').reshape(-1)))[0]\n10000 loops, best of 3: 75 \xc2\xb5s per loop\n\nIn [25]: %timeit np.nonzero(np.in1d(A.view(dt).reshape(-1), B.view(dt).reshape(-1)))[0]\n10000 loops, best of 3: 29.8 \xc2\xb5s per loop\n
Run Code Online (Sandbox Code Playgroud)\n