我有两个矩阵(或更好的2D numpy数组),A
和B
,列数相同(嗯,公平地说它们有不同的行数,但是我和#39;我只是在两列上切割两个矩阵)但行数不同。
我想检查A
中的每一行是否都在B
中,B
中的行索引是什么。我实际上正在使用常规循环,即
for r in range(A.shape[0]):
idx=numpy.where(numpy.all(B[:,[0,1]]==A[r,[1,2]],axis=1))
idx=idx[0][0]
我想知道是否有一些更聪明的技术可以这样做,可能使用索引方法和避免循环。我知道numpy的in1d
,但它只适用于1D阵列。
对于熟悉Matlab的读者,我在触发ismember()
选项时寻找'rows'
行为。
答案 0 :(得分:1)
您可以使用NumPy broadcasting
使用矢量化方法,就像这样 -
np.argwhere((B[:,None,[0,1]] == A[:,[1,2]]).all(-1))
或者,由于您正在处理仅2
个元素的行,因此可以建议保留2D
的内存有效方法,如此 -
np.argwhere((B[:,None,0] == A[:,1]) & (B[:,None,1] == A[:,2]))
输出为(N,2)
形状的数组,其中第一列为我们提供B
的行索引,第二列为A
,对应于行中所有元素的匹配
示例运行 -
In [154]: A[:,[1,2]]
Out[154]:
array([[0, 1],
[0, 2],
[2, 1],
[1, 2],
[0, 1]])
In [155]: B[:,[0,1]]
Out[155]:
array([[0, 1],
[2, 2],
[1, 2],
[0, 2],
[2, 1],
[2, 1],
[1, 0]])
In [156]: np.argwhere((B[:,None,[0,1]] == A[:,[1,2]]).all(-1))
Out[156]:
array([[0, 0],
[0, 4],
[2, 3],
[3, 1],
[4, 2],
[5, 2]])