我有一个稀疏矩阵csr
:
<681881x58216 sparse matrix of type '<class 'numpy.int64'>'
with 2867209 stored elements in Compressed Sparse Row format>
我想创建一个新的sparce矩阵作为csr
的切片:
csr_2 = csr[1::2,:]
。
问题:当我只有csr
矩阵时,我服务器的RAM忙于40 GB。当我运行csr_2 = csr[1::2,:]
时,我的服务器的RAM将被完全转储为128GB,并且会出现“内存错误”。
答案 0 :(得分:0)
sparse
使用矩阵乘法来选择这样的行。我在另一个SO问题中计算了extractor
矩阵的细节,但是大致从(m,n)得到一个(p,n)矩阵,它需要使用(p,m)矩阵( p
非零值。)
矩阵乘法本身是一个2遍过程。第一遍确定结果矩阵的大小。
与密集numpy
数组相比,稀疏矩阵切片永远不会返回视图。
Sparse matrix slicing using list of int
有关于提取器矩阵的详细信息。我还建议测试csr.sum(axis=1)
,因为它也使用矩阵乘法。
def extractor(indices, N):
indptr=np.arange(len(indices)+1)
data=np.ones(len(indices))
shape=(len(indices),N)
return sparse.csr_matrix((data,indices,indptr), shape=shape)
所以索引每隔一行需要:
In [99]: M = sparse.random(100,80,.1, 'csr')
In [100]: M
Out[100]:
<100x80 sparse matrix of type '<class 'numpy.float64'>'
with 800 stored elements in Compressed Sparse Row format>
In [101]: E = extractor(np.r_[1:100:2],100)
In [102]: E
Out[102]:
<50x100 sparse matrix of type '<class 'numpy.float64'>'
with 50 stored elements in Compressed Sparse Row format>
In [103]: M1 = E*M
In [104]: M1
Out[104]:
<50x80 sparse matrix of type '<class 'numpy.float64'>'
with 407 stored elements in Compressed Sparse Row format>