Numpy 如何删除小的非零值并增加稀疏性?

Numpy 如何删除小的非零值并增加稀疏性?,numpy,scipy,sparse-matrix,Numpy,Scipy,Sparse Matrix,我有一个很大的csr_矩阵(46000*46000),但是这个矩阵非常密集,它的稀疏度约为0.05%。大多数非零值都小于1,我想删除这些值并增加稀疏度 import scipy.sparse as sp cgc=sp.load_npz('/root/cg.npz') print cgc.count_nonzero() #2115920056 cgc=cgc[cgc>1] #too slow 您有两个选择

我有一个很大的csr_矩阵(46000*46000),但是这个矩阵非常密集,它的稀疏度约为0.05%。大多数非零值都小于1,我想删除这些值并增加稀疏度

import scipy.sparse as sp
cgc=sp.load_npz('/root/cg.npz')
print cgc.count_nonzero()                 #2115920056
cgc=cgc[cgc>1]                            #too slow
您有两个选择:

  • 将元素归零,然后进行转换。这在阵列上起作用以节省内存和时间,但会更改原始阵列(它似乎已保存到磁盘上,因此不应该是问题):


并让它成为稀疏矩阵
-你是说其中一个SciPy稀疏矩阵吗?是的,我想删除大多数非零值并增加矩阵的稀疏度。你可以执行掩蔽来更改
cgc.data
的值。那应该很快。但是你需要运行inplace
eliminate_zeros
方法,这会更慢。谢谢,但是矩阵中有数十亿个none值小于1,所以“cgc[cgcSlow是真的,但我不太确定是否“低效”。我说低效与“cgc=cgc[cgc>1]”相比,刚才我找到了一个选项“cgc.astype”(“int32”)“,我认为还有其他方法可以解决这个问题
cgc[cgc<1] = 0
cgc = scipy.sparse.csr_matrix(cgc)
i, j = np.flatnonzero(cgc > 1)
cgc_sparse = np.csr_matrix((cgc[i, j], (i, j)))