使用稀疏索引和值更新 numpy 数组

Update numpy array with sparse indices and values

我有一个一维 numpy 数组,想存储它的稀疏更新。 假设我有一个长度为 500000 的数组,并且想要对 100 个元素进行 100 次更新。更新要么是添加,要么只是更改值(我认为这不重要)。

使用 numpy 的最佳方法是什么? 我只想存储两个数组:索引,values_to_add,因此有两个对象:一个存储密集矩阵,另一个只保存要添加的索引和值,我可以用密集矩阵做这样的事情:

dense_matrix[indices] += values_to_add

如果我有多个更新,我只是将它们连接起来。

但是这种 numpy 语法不适用于重复的元素:它们只是被忽略了。

当我们有一个重复索引的更新时更新对是 O(n)。我想到了用dict代替array来存储更新,从复杂度上看还不错,但是numpy风格看起来不太好

实现这一目标的最具表现力的方式是什么?我知道 scipy 个稀疏对象,但是 (1) 我想要纯 numpy,因为 (2) 我想了解实现它的最有效方法。

如果您有重复的索引,您可以使用 at,来自文档:

Performs unbuffered in place operation on operand ‘a’ for elements specified by ‘indices’. For addition ufunc, this method is equivalent to a[indices] += b, except that results are accumulated for elements that are indexed more than once.

代码

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]