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

时间:2018-05-08 01:48:50

标签: python sparse-matrix

我试图"翻译"一些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()的函数调用。那么在这种情况下我最好的选择是什么呢?

提前致谢。

1 个答案:

答案 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