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

时间:2018-10-28 12:07:26

标签: python arrays numpy sparse-matrix

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

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

dense_matrix[indices] += values_to_add

如果我有多个更新,则只需合并它们即可。

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

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

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

1 个答案:

答案 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]