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 将这些值映射回原始字段。
我有两个 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 将这些值映射回原始字段。