Python scipy.sparse:如何有效地将一组条目设置为0?
Python scipy.sparse: how to efficiently set a set of entries to 0?
设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,n,2),range(0,n,2)]); print(IJ) #every second diagonal
你快到了。按照您的定义,您需要做的就是:
a[IJ[0],IJ[1]] = 0
请注意,scipy 会警告您:
SparseEfficiencyWarning: Changing the sparsity structure of a csr_matrix is expensive. lil_matrix is more efficient.
您可以阅读更多相关内容 。
scipy 稀疏矩阵不能有 non-zero 背景值。虽然可以制作一个具有很多 non-zero 值的“稀疏”矩阵,但性能(速度和内存)会比密集矩阵乘法差得多。
一个可能的 work-around 是重写每个稀疏矩阵,使其默认值为零。例如,如果矩阵 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
设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,n,2),range(0,n,2)]); print(IJ) #every second diagonal
你快到了。按照您的定义,您需要做的就是:
a[IJ[0],IJ[1]] = 0
请注意,scipy 会警告您:
SparseEfficiencyWarning: Changing the sparsity structure of a csr_matrix is expensive. lil_matrix is more efficient.
您可以阅读更多相关内容
scipy 稀疏矩阵不能有 non-zero 背景值。虽然可以制作一个具有很多 non-zero 值的“稀疏”矩阵,但性能(速度和内存)会比密集矩阵乘法差得多。
一个可能的 work-around 是重写每个稀疏矩阵,使其默认值为零。例如,如果矩阵 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