微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Python scipy.sparse:如何有效地将一组条目设置为0?

如何解决Python scipy.sparse:如何有效地将一组条目设置为0?

a一个大的scipy.sparse矩阵,并且IJ = {(i0,j0),(i1,j1),...}一组位置。如何有效地将aIJ中所有条目设置为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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。