如何在Numpy中找到矩阵的公共成员

如何在Numpy中找到矩阵的公共成员,numpy,Numpy,我有一个2D矩阵a和一个向量B。我想找到a中元素的所有行索引,它们也包含在B中 A = np.array([[1,9,5], [8,4,9], [4,9,3], [6,7,5]], dtype=int) B = np.array([2, 4, 8, 10, 12, 18], dtype=int) 我目前的解决方案是一次只将A与B的一个元素进行比较,但速度非常慢: res = np.array([], dtype=int) for i in range(B.shape[0]): cres

我有一个2D矩阵a和一个向量B。我想找到a中元素的所有行索引,它们也包含在B中

A = np.array([[1,9,5], [8,4,9], [4,9,3], [6,7,5]], dtype=int)
B = np.array([2, 4, 8, 10, 12, 18], dtype=int)
我目前的解决方案是一次只将A与B的一个元素进行比较,但速度非常慢:

res = np.array([], dtype=int)
for i in range(B.shape[0]):
    cres, _ = (B[i] == A).nonzero()
    degElem = np.append(res, cres)
res = np.unique(res)
以下Matlab语句将解决我的问题:

find(any(reshape(any(reshape(A, prod(size(A)), 1) == B, 2),size(A, 1),size(A, 2)), 2))
然而,在Numpy中比较行和列向量并不像在Matlab中那样创建布尔交集矩阵。
在Numpy中有没有合适的方法来实现这一点?

我们可以使用
np.isin
掩蔽

要获取所有行号,它将是-

np.where(np.isin(A,B).T)[1]
np.where(B[:,None,None]==A)[1]
如果需要,请根据每个元素的出现情况进行拆分-

[np.flatnonzero(i) for i in np.isin(A,B).T if i.any()]
发布的MATLAB代码似乎正在进行
广播
。因此,一个等价的-

np.where(np.isin(A,B).T)[1]
np.where(B[:,None,None]==A)[1]

您当前的Python解决方案是否有效?您能否发布所需的示例输出?谢谢是的,我以前的解决方案确实有效。所需的输出是具有行号的1d numpy数组。