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

3
我希望能够在另一个一维numpy数组(arr2)中找到给定一维numpy数组(arr1)元素的频率。数组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个回答

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进行排序作为预处理步骤。由于arr1是从arr2中唯一元素的一部分,因此它应该是一个相对较小的数组,因此排序操作较为廉价。

  2. 使用searchsortedsorter参数计算idx:

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


假设 arr1 已经排序。 - galah92
谢谢。 :) 假设 arr1 已经排序。 - Siddharth Satpathy
当我从arr1 = np.array([1,2,6])更改为arr1 = np.array([1,2,3])时,我遇到了一个错误(IndexError: index 3 is out of bounds for axis 1 with size 3)。我想知道是否有什么我漏掉的东西。 - Siddharth Satpathy
@SiddharthSatpathy 需要进行编辑。现在应该已经修复了。 - Divakar
谢谢,Divakar。非常感谢你的帮助。 :) - Siddharth Satpathy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接