构建大型scipy稀疏矩阵

时间:2016-10-08 19:23:02

标签: scipy sparse-matrix

构建scipy稀疏矩阵的最佳方法之一是使用coo_matrix方法,即

[].push(element)

但是,如果矩阵非常大,将整个i,j和数据向量加载到内存中是不切实际的。

如何构建一个coo_matrix,以便(数据,(i,j))从磁盘(带有迭代器或生成器)从磁盘提供,并且磁盘上的数组/向量对象是.npy或pickle格式?

Pickle是更好的选择,因为numpy.save/load没有针对scipy稀疏进行优化。也许还有另一种更快的格式。

numpy.genfromtext()和numpy.loadtxt()都是繁琐,缓慢和内存耗尽的。

1 个答案:

答案 0 :(得分:0)

我不太明白。如果i, j, data数组太大而无法创建或加载到内存中,那么它们太大而无法创建稀疏矩阵。

如果这三个数组有效,则生成的稀疏矩阵将使用它们而不进行复制或更改,作为相应的属性。由csr构造的coo矩阵可能更紧凑,因为其indptr数组每行有一个值。 dataindices数组的大小与coo相同(给定或者给出重复数据和排序)。

doklil格式可用于增量矩阵创建,但从长远来看,它们不会节省内存。两者仍然必须为每个非零数据点都有一个条目。在lil案例中,您将拥有一堆列表;而dok是一个真正的字典。

所有稀疏格式都不是“虚拟”,根据需要“即时”创建元素。

我不知道如果它们的总大小太大,加载3个定义数组的各种方法有何帮助。

In [782]: data=np.ones((10,),int)
In [783]: rows=np.arange(10)
In [784]: cols=np.arange(10)
In [785]: M=sparse.coo_matrix((data,(rows,cols)))
In [786]: M.data
Out[786]: array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1])
In [787]: M.data is data
Out[787]: True
In [789]: M.col is cols
Out[789]: True

基本上coo格式是存储这3个数组的一种方式。实际工作,所有数学,求和,甚至索引都是使用csr格式执行的。