我试图"翻译"一些Matlab代码到Python中,Matlab中有一行将稀疏矩阵中的多行设置为0:
Ks(idx,:)=0; %no affinity for W inside fs
其中Ks
是稀疏矩阵(对称且尺寸相当大),idx
是一个1D数组,表示行索引进行更改,它也很体积大。在下一行中,它还将这些列更改为0,因此Ks
仍然是对称的:
Ks(:,idx)=0;
在Python中做类似的事情(Ks[idx,:]=0
)似乎只适用于小矩阵,当它变大时我得到MemoryError
。目前我的Ks
是一个csr矩阵,将其转换为lil
,这样做非常慢。
我不太熟悉稀疏矩阵,我知道在Python中有超过1种类型(例如csr,csc,lil等),但在Matlab代码中没有这样的区别,我只找到sparse()
的函数调用。那么在这种情况下我最好的选择是什么呢?
提前致谢。
答案 0 :(得分:0)
加速的一种方法是,不是将稀疏矩阵元素设置为零,而是首先将numpy nd数组的元素设置为零,然后转换为稀疏矩阵。在下面的例子中,我的速度提升了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