每当我将稀疏矩阵的一个切片乘以一个常数后,我就会失去矩阵的稀疏性,因为Scipy开始为每个空条目计算0 * constant
,然后用{{1}填充所有空条目}。真傻我该如何阻止它呢?索引必须是整数或布尔值。他们不能使用0
。
例如
:
结果
A = scipy.sparse.csr_matrix([[0, 1], [0, 0]])
print(A, '/n' )
A[[0,0],[0,1]] *= -1
print(A)
A的大小应该没有改变。
编辑: 由于目前尚不清楚我要实现的目标,我想将一个稀疏矩阵中的多个元素乘以一个常数,而又不损失该矩阵的稀疏性,而不必求助于比线性运算更昂贵的运算。非零元素个数,即使用稀疏结构。因此,也不必复制整个稀疏矩阵,这意味着乘法必须就位。
答案 0 :(得分:0)
您可以尝试:
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)