检查矩阵的每一行是否在另一个矩阵中[Python]

时间:2016-05-30 22:42:50

标签: python numpy matrix

我有两个矩阵(或更好的2D numpy数组),AB,列数相同(嗯,公平地说它们有不同的行数,但是我和#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'行为。

1 个答案:

答案 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]])