在 1D ary 和 2D ary 中的每一行之间相交?重叠计数?

Intersect between 1D ary and every row in 2D ary ? Overlap Count?

您可以使用 numpy.intersect1d(a1,a2) 然后文档提供了一个选项来交叉多个数组:

reduce(np.intersect1d, ([1, 3, 4, 3], [3, 1, 2, 1], [6, 3, 4, 2]))

我想做的是找到一个一维数组和对应的二维数组中每一行的交集。

或更好但只是每行中重叠元素的 COUNT 个。

我知道我可以用 intersect1d() 和一个循环来做到这一点,但它会太

我们如何计算每行中的重叠元素numpy-way


例如:

In [59]: a2 = np.random.choice(np.arange(0,100),(10,5), replace=False)

In [60]: a2
Out[60]: 
array([[50,  5, 25, 40, 19],  1
       [43, 37, 21, 55, 11],  0
       [16, 49,  6, 86, 96],  0
       [80, 66, 87, 51, 64],  0
       [42,  7, 20, 24, 74],  1
       [92, 63, 75, 54, 90],  2
       [ 9, 91, 88, 85, 22],  0
       [ 4, 65, 97, 93, 53],  0
       [18,  0, 57, 71, 76],  0
       [94,  1, 77, 89, 45]]) 0

In [61]: a1 = np.random.choice(np.arange(0,100),5, replace=False)


In [63]: a1
Out[63]: array([63, 54, 20, 60, 25])

为了简单地获取每行公共元素的计数,我们可以使用 np.isin 获取匹配掩码,然后仅获取每行的计数 -

np.isin(arr2D,arr1D).sum(axis=1)

如果你想在每行重复出现的情况下只计算每个唯一元素一次,并且如果输入元素是正数,我们需要更多的步骤 -

#  @Divakar
def bincount2D_vectorized(a):    
    N = a.max()+1
    a_offs = a + np.arange(a.shape[0])[:,None]*N
    return np.bincount(a_offs.ravel(), minlength=a.shape[0]*N).reshape(-1,N)

count = (bincount2D_vectorized(np.isin(arr2D,arr1D)*arr2D)[:,1:]!=0).sum(1)