在 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)
您可以使用 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)