我想得到一个主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]
这应该根据数组A的索引返回[0,2]。
如何有效地为二维阵列做到这一点?
谢谢!
修改
我尝试过这个功能:
k[np.in1d(k.view(dtype='i,i').reshape(k.shape[0]),k2.view(dtype='i,i').
reshape(k2.shape[0]))]
来自Implementation of numpy in1d for 2D arrays?,但我收到了重塑错误。我的数据类型是浮点数(带有两位小数)。 此外,我也试过套装,但性能很慢。
答案 0 :(得分:4)
只需极少的更改,您就可以开始工作:
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)
如果您的数组不是浮点数,并且两者都是连续的,那么以下内容会更快:
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)
快速的时机:
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
答案 1 :(得分:2)
您可以使用np.char.array()
对象使用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)
注意:A
和B
必须具有相同的数据类型(int
,float
等)才能生效。