gpt4 book ai didi

python - 替换 Scipy (Python) 创建的稀疏矩阵中的元素

转载 作者:太空宇宙 更新时间:2023-11-03 18:22:20 26 4
gpt4 key购买 nike

我在 Scipy 中有一个巨大的稀疏矩阵,我想用给定值替换其中的大量元素(假设 -1)。

有没有比使用更有效的方法:

SM[[rows],[columns]]=-1

这是一个例子:

Nr=seg.shape[0] #size ~=50000

Im1=sparse.csr_matrix(np.append(np.array([-1]),np.zeros([1,Nr-1])))
Im1=sparse.csr_matrix(sparse.vstack([Im1,sparse.eye(Nr)]))
Im1[prev[1::]-1,Num[1::]-1]=-1 # this line is very slow

Im2=sparse.vstack([sparse.csr_matrix(np.zeros([1,Nr])),sparse.eye(Nr)])

IM=sparse.hstack([Im1,Im2]) #final result

最佳答案

我已经玩过你的稀疏数组。我鼓励您对较小的尺寸进行一些计时,以了解不同的方法和稀疏类型的行为方式。我喜欢在 Ipython 中使用 timeit

Nr=10 # seg.shape[0] #size ~=50000
Im2=sparse.vstack([sparse.csr_matrix(np.zeros([1,Nr])),sparse.eye(Nr)])

Im2 第一行为零,其余行有偏移对角线。因此,从空稀疏矩阵开始会更简单,但速度不会快得多:

X = sparse.vstack([sparse.csr_matrix((1,Nr)),sparse.eye(Nr)])

或者使用diags直接构造偏移对角线:

X = sparse.diags([1],[-1],shape=(Nr+1, Nr))

Im1 类似,只是它的 (0,0) 槽中有一个 -1。堆叠 2 个对角矩阵怎么样?

X = sparse.vstack([sparse.diags([-1],[0],(1,Nr)),sparse.eye(Nr)])

或者制作偏移对角线(复制Im2?),并修改[0,0]csr 矩阵给出了效率警告,建议使用 lil 格式。不过,转换 tolil() 确实需要一些时间。

X = sparse.diags([1],[-1],shape=(Nr+1, Nr)).tolil()
X[0,0] = -1 # slow warning with csr

让我们尝试一下更大的插入:

prev = np.arange(Nr-2)  # what are these like?
Num = np.arange(Nr-2)
Im1[prev[1::]-1,Num[1::]-1]=-1

使用 Nr=10 和各种 Im1 格式:

lil - 267 us
csr - 1.44 ms
coo - not supported
todense - 25 us

好的,我选择了 prevNum,这样我最终修改了 Im1 的对角线。在这种情况下,从一开始就构建这些对角线会更快。

X2=Im1.todia()
print X2.data
[[ 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
[-1. -1. -1. -1. -1. -1. -1. 0. 0. 0.]]
print X2.offsets
[-1 0]

您可能需要了解各种稀疏格式是如何存储的。 csrcsc 有点复杂,专为快速线性代数运算而设计。 lildiacoo 更容易理解。

关于python - 替换 Scipy (Python) 创建的稀疏矩阵中的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23869494/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com