我有一维numpy数组,想存储它的稀疏更新。 假设我的数组长度为500000,并且想对100个元素进行100次更新。更新要么是添加的,要么只是更改值(我认为这并不重要)。
使用numpy的最佳方法是什么? 我只想存储两个数组:索引,values_to_add,因此有两个对象:一个存储密集矩阵,另一个仅保留索引和值相加,而我可以使用密集矩阵做类似的事情:
dense_matrix[indices] += values_to_add
如果我有多个更新,则只需合并它们即可。
但是这种numpy语法不适用于重复的元素:它们只会被忽略。
当我们有重复索引的更新时,更新对为O(n)。我想到了用dict而不是数组来存储更新,从复杂性的角度来看,这看起来不错,但它看起来不是很好的numpy风格。
实现这一目标的最富有表现力的方法是什么?我知道scipy稀疏对象,但是(1)我想要纯粹的numpy,因为(2)我想了解实现它的最有效方法。
答案 0 :(得分:1)
如果您有重复的索引,则可以使用at(来自文档):
对元素的操作数“ a”执行无缓冲的就地操作 由“索引”指定。对于加法ufunc,此方法等效 到a [索引] + = b,除了元素的结果是累积的 被索引一次以上的
代码
a = np.arange(10)
indices = [0, 2, 2]
np.add.at(a, indices, [-44, -55, -55])
print(a)
输出
[ -44 1 -108 3 4 5 6 7 8 9]