将大型scipy稀疏矩阵的多行和多列设置为0s

2024-09-17 02:13:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图将一些Matlab代码“翻译”成Python,Matlab中有一行代码将稀疏矩阵中的多行设置为0:

Ks(idx,:)=0; %no affinity for W inside fs

其中Ks是稀疏矩阵(对称且大小相当大),而{}是一个1D数组,表示要进行更改的行索引,它的大小也相当大。在下一行中,它还将这些列更改为0,因此Ks仍然是对称的:

^{pr2}$

在Python中做类似的事情(Ks[idx,:]=0)似乎只对小矩阵有效,当它变大时我得到MemoryError。目前,我的Ks是一个csr矩阵,将其转换为lil,而且这样做非常慢。在

我不太熟悉稀疏矩阵,我知道在Python中有不止一种类型(例如csr、csc、lil等),但是在Matlab代码中没有这样的区别,我只找到了一个函数调用sparse()。那么在这种情况下,我的最佳选择是什么?在

提前谢谢。在


Tags: no代码for矩阵数组事情fsks
1条回答
网友
1楼 · 发布于 2024-09-17 02:13:43

一种加速的方法是,不要将稀疏矩阵元素设置为零,而是先将numpy nd array的元素设置为零,然后转换为稀疏矩阵。在下面的例子中,我的速度提高了10倍以上。在

import numpy as np
import scipy.sparse as sps
np.random.seed(20)
mat = np.random.randint(-2000,2000,size=(1000,1000))
sym_mat = (mat + mat.T)/2

zero_rows =  np.random.randint(0,999,(900,))


%%timeit
sparse = sps.csr_matrix(sym_mat)
sparse[zero_rows,:] = 0
sparse[:,zero_rows] = 0

/usr/local/lib/python3.6/dist-packages/scipy/sparse/compressed.py:774: SparseEfficiencyWarning: Changing the sparsity structure of a csr_matrix is expensive. lil_matrix is more efficient.
  SparseEfficiencyWarning)
1 loop, best of 3: 206 ms per loop

%%timeit
sym_mat[zero_rows,:] = 0
sym_mat[:,zero_rows] = 0
sparse1 = sps.csr_matrix(sym_mat)

100 loops, best of 3: 18.9 ms per loop

相关问题 更多 >