问题描述
让a
是一个大的scipy.sparse
矩阵,并且IJ = {(i0,j0),(i1,j1),...}一组位置。如何有效地将a
中IJ
中所有条目设置为0?像a[IJ]=0
之类的东西。
在Mathematica中,我将创建一个新的稀疏矩阵b
,其背景值为1(而不是0),并且IJ
中的所有条目都为该值。然后,我将使用a=a*b
(逐项乘法)。这似乎不是一个选择。
一个玩具示例:
import scipy.sparse as sp
import numpy as np
np.set_printoptions(linewidth=200,edgeitems=5,precision=4)
m=n=10**1;
a=sp.random(m,n,4/m,format='csr'); print(a.toarray())
IJ=np.array([range(0,2),range(0,2)]); print(IJ) #every second diagonal
解决方法
您快到了。要按照您的定义进行操作,您需要做的只是:
a[IJ[0],IJ[1]] = 0
请注意,scipy会警告您:
SparseEfficiencyWarning:更改csr_matrix的稀疏结构非常昂贵。 lil_matrix效率更高。
您可以了解有关here的更多信息。
,scipy稀疏矩阵的背景值不能为零。尽管可以制作一个具有很多非零值的“稀疏”矩阵,但性能(速度和内存)将远不如密集矩阵乘法。
可能的解决方法是将每个稀疏矩阵重写为默认值零。例如,如果矩阵Y'
主要包含1,我可以用Y'
替换I - Y
,其中Y = I - Y'
和I
是单位矩阵。
import scipy.sparse as sp
import numpy as np
size = (100,100)
x = np.random.uniform(-1,1,size=size)
y = sp.random(*size,0.001,format='csr')
# Z = (I - Y)X = X - YX
z = x - y.multiply(x)
# A = X(I - Y) = X - XY = X - transpose(YX)
a = x - y.multiply(x).T