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实现二维数组?但我得到了一个重塑错误.我的数据类型是浮点数(带有两位小数).此外,我也试过套装,但性能很慢.
只需进行最少的更改,您就可以让您的方法发挥作用:
\n\nIn [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)\nRun Code Online (Sandbox Code Playgroud)\n\n如果您的数组不是浮点数,并且都是连续的,那么以下方法会更快:
\n\nIn [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)\nRun Code Online (Sandbox Code Playgroud)\n\n并快速计时:
\n\nIn [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\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
1464 次 |
| 最近记录: |