Python/Numpy - 计算相等数组元素的总和

Python/Numpy - calculate sum of equal array elements

我有两个 numpy 数组,看起来像:

field = np.array([5,1,3,3,2,1,6])    
counts = np.array([100,210,300,150,20,90,170])

它们没有排序(并且不应该改变)。我现在想计算第三个数组(具有相同的长度和顺序),它包含位于同一字段中的计数总和。这里的结果应该是:

field_counts = np.array([100,300,450,450,20,300,170])

数组非常长,遍历它(并始终查找相应合作伙伴字段的位置)效率太低。也许我只是见树不见林......我希望有人能帮助我解决这个问题!

我不知道它是否足够有效(因为我确实遍历了 field)但这是一个建议。我首先创建一个 field/counts 值的目录。然后,我基于它创建一个数组。

from collections import defaultdict
dic = defaultdict(int)
for j, f in enumerate(field):
    dic[f] += counts[j]

field_counts = np.array([dic[f] for f in field])

使用以下列表理解:

>>> [np.sum(counts[np.where(field==i)]) for i in field]
[100, 300, 450, 450, 20, 300, 170]

你可以用np.where得到field中相同元素的索引:

>>> [np.where(field==i) for i in field]
[(array([0]),), (array([1, 5]),), (array([2, 3]),), (array([2, 3]),), (array([4]),), (array([1, 5]),), (array([6]),)]

然后用索引得到counts对应的元素!并用 np.sum.

计算 sum

这个问题可以使用 numpy_indexed 包以完全矢量化的方式解决(免责声明:我是它的作者)

import numpy_indexed as npi
g = npi.group_by(field)
field_counts = g.sum(counts)[1][g.inverse]

g.sum 计算每组唯一字段的总和,g.inverse 将这些值映射回原始字段。