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

Python 使用稀疏索引和值更新numpy数组,python,arrays,numpy,sparse-matrix,Python,Arrays,Numpy,Sparse Matrix,我有一个一维numpy数组,希望存储它的稀疏更新。 假设我有一个长度为500000的数组,并希望对100个元素进行100次更新。更新要么是添加,要么只是更改值(我认为这无关紧要) 使用numpy的最佳方式是什么? 我想只存储两个数组:索引,值,因此有两个对象:一个存储密集矩阵,另一个只保存索引和值,我可以对密集矩阵做如下操作: dense_matrix[indices] += values_to_add 如果我有多个更新,我只需点击它们 但是这种numpy语法不能很好地处理重复的元素:它们只是

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

使用numpy的最佳方式是什么? 我想只存储两个数组:索引,值,因此有两个对象:一个存储密集矩阵,另一个只保存索引和值,我可以对密集矩阵做如下操作:

dense_matrix[indices] += values_to_add
如果我有多个更新,我只需点击它们

但是这种numpy语法不能很好地处理重复的元素:它们只是被忽略了

当我们有一个重复索引为O(n)的更新时,更新对。我曾想过使用dict而不是数组来存储更新,从复杂性的角度来看,这看起来不错,但看起来不是很好的numpy风格


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

如果您有可以使用的重复索引,请参阅文档:

对元素的操作数“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]

这个问题与稠密矩阵[索引]+=值的加法一样。没有办法在我需要更新之前收集更新。a=np.arange(10)index=[0,2,2]np.put(a,index,a[index]+[-44,-55,-55])->[-44 1-53 3 4 5 6 7 8 9]我明白了,你想得到最后的更新还是所有的更新?我有这个稀疏数组,想分多个步骤,但一次更新它。我想将所有更新存储在一个更新对象中,并立即应用它们(也许解决这个问题的更好方法就是每次更新…)