Python中:lil_matrix和csr_matrix在极大稀疏矩阵中的区别

5
我想要逐步构建一个非常大的稀疏矩阵,但问题是 lil_matrix 占用了过多的内存,使得效率降低。例如,如果我想要创建一个20,000,000 x 20,000,000的lil_matrix,它会完全耗尽我的内存。另一方面,csr_matrix 几乎不占用空间。然而,据称 csr_matrix 修改效率不高。有没有其他方法可以在不占用过多内存的情况下获得 lil_matrix 的优势?此外,既然它被认为是一种稀疏矩阵,为什么会占用那么多的空间呢?
注:实际问题并不是创建如此巨大的矩阵,而是要创建以下的list
list = [sp.lil_matrix((150,150)) for i in range(1000)]

这也会使我的内存爆满。


从实验结果来看,lil_matrix() 猜测的稀疏结构相当慷慨。因此,每个构造的矩阵所占用的内存可能比你需要的要多。csr_matrix 在索引赋值方面较慢,但在初始分配方面更为保守。根据您的数据,您可能需要在 lil_matrix() 构造函数中添加 dtype=int。 - gerowam
1个回答

4

我不敢说我有完整的答案,但我觉得如果你看一下矩阵内部结构,你会找到答案。

In [12]: s = sparse.csr_matrix((5,5))

In [13]: s.__dict__
Out[13]: 
{'_shape': (5, 5),
 'data': array([], dtype=float64),
 'format': 'csr',
 'indices': array([], dtype=int32),
 'indptr': array([0, 0, 0, 0, 0, 0], dtype=int32),
 'maxprint': 50}

In [14]: s.indptr.nbytes
Out[14]: 24

In [15]: l = sparse.lil_matrix((5,5))

In [16]: l.__dict__
Out[16]: 
{'_shape': (5, 5),
 'data': array([[], [], [], [], []], dtype=object),
 'dtype': dtype('float64'),
 'format': 'lil',
 'maxprint': 50,
 'rows': array([[], [], [], [], []], dtype=object)}

In [17]: l.data.nbytes
Out[17]: 40

In [18]: l.rows.nbytes
Out[18]: 40

1
那很有帮助。所以基本上,lil_matrix根本不是稀疏的,因为它初始化了与普通矩阵相同数量的空间。那么一开始使用它有什么意义呢? - Michael
1
@Michael,lil_matrix肯定是稀疏的,它只是以不同于csr_matrix的方式存储信息。一个普通的5x5密集矩阵包含np.float需要200字节。您可以在此处阅读有关lil_matrix的优缺点:http://docs.scipy.org/doc/scipy/reference/generated/scipy.sparse.lil_matrix.html - Akavall

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接