使用稀疏索引和值更新 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]
我有一个一维 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]