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