首页 > 解决方案 > 如何在不改变稀疏度的情况下将稀疏 scipy 矩阵的切片乘以常数

问题描述

每当我将稀疏矩阵的切片乘以一个常数时,我就会失去矩阵的稀疏性,因为 Scipy 开始计算0 * constant每个空条目,然后用0. 这是愚蠢的。我该如何阻止它这样做?索引需要是整数或布尔值。他们不能使用:.

所以例如

A = scipy.sparse.csr_matrix([[0, 1], [0, 0]])
print(A, '/n' )

A[[0,0],[0,1]] *= -1
print(A)

结果是

(0, 1)  1 

(0, 0)  0
(0, 1)  -1

A 的大小不应该改变。

编辑:由于似乎不清楚我要实现什么,我想将稀疏矩阵中的许多元素乘以一个常数,而不会失去该矩阵的稀疏性,也不必诉诸比线性更昂贵的操作在该数量的元素中的数量非零元素中,即使用稀疏结构。所以也没有复制整个稀疏矩阵,这意味着乘法必须到位。

标签: pythonscipysparse-matrixmultiplication

解决方案


你可以试试:

A[0, 1] *= -1

然后

print(A)

产量

(0, 1)  -1

或者,至少在这种情况下,简单地

print(A * (-1))

产生相同的输出:

(0, 1)  -1

通过做

A[[0,0],[0,1]]

您选择零条目,然后填充;如果您只选择一个非零条目,如上所示,它将按预期工作。

from scipy.sparse import csr_matrix
A = csr_matrix([[0, 1], [5, 0]])

现在你可以简单地做

print(A * (-1))
(0, 1)  -1
(1, 0)  -5

您还可以通过传递元组来修改特定条目

A[(0, 1), (1, 0)] *= -1
print(A)

还将返回所需的输出:

(0, 1)  -1
(1, 0)  -5

显然,如果您想更改所有非零条目,我会选择

A * (-1)

推荐阅读