计算另一个数组中一个数组的元素的出现

时间:2019-01-10 20:40:42

标签: python arrays python-2.7 numpy

我想找到另一维一维numpy数组(arr1)中给定一维numpy数组(arr2)的元素的频率。数组arr1包含没有重复的元素。另外,arr1中的所有元素都是arr2

的唯一元素数组的一部分

以这个为例,

arr1 = np.array([1,2,6])
arr2 = np.array([2, 3, 6, 1, 2, 1, 2, 0, 2, 0])

目前,我正在使用以下内容:

freq = np.zeros(  len(arr1)  )

for i in range( len(arr1) ):
    mark = np.where( arr2==arr1[i] )
    freq[i] = len(mark[0])

print freq
>>[2, 4, 1]

上述方法给了我正确答案。但是,我想知道是否有一种比我正在遵循的方法更好/更有效的方法。

1 个答案:

答案 0 :(得分:4)

这是基于np.searchsorted的矢量化解决方案-

idx = np.searchsorted(arr1,arr2)
idx[idx==len(arr1)] = 0
mask = arr1[idx]==arr2
out = np.bincount(idx[mask])

假定arr1已排序。如果不是这样,我们有两种解决方案:

  1. arr1排序为预处理步骤。由于arr1arr2中唯一元素的一部分,因此它应该是一个相对较小的数组,因此是一种廉价的排序操作。

  2. 使用sorter的arg和searchsorted来计算idx

    sidx = arr1.argsort(); idx = sidx[np.searchsorted(arr1,arr2,sorter=sidx)]