给定一个 NumPy 数组和一个多对一映射数组,计算聚合映射值的最快方法是什么

时间:2021-02-23 15:20:49

标签: python numpy

我有两个 NumPy 数组,一个包含值,另一个将值从第一个映射到一个新的聚合数组,如下所示

a = np.array([10,10,10,10,10,10]) # values array
b = np.array([0,0,1,2,2,2]) # mapping to new index set
size = np.max(b) + 1
result =np.zeros(size)
for i in range(size):
    result[i] = np.sum(a[b==i]) # values mapped to the same index are aggregated
print(result)

这给出了: result = [20. 10. 30.] 以上工作,但由于 for 循环,它没有完全矢量化,使其变慢。根据我对线性代数的了解,我知道我可以将向量 b 转换为转换矩阵,然后使用 dot 函数在没有 for 循环的情况下执行此操作,但这将意味着比此处所需的基本运算量大得多,因此采用这种方法也是次优的。有没有办法直接用 NumPy 做到这一点? :) 原则上,所需的操作量应该只是a.size summations...

1 个答案:

答案 0 :(得分:1)

np.add.at(result, b, a) 替换循环。这将进行您想要的就地聚合。有关 at 方法的一般说明,请参阅 ufunc.at