稀疏矩阵切片内存错误

时间:2017-09-04 09:34:29

标签: python numpy scipy sparse-matrix

我有一个稀疏矩阵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,并且会出现“内存错误”。

1 个答案:

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