2016-10-08 198 views
0

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

coo_matrix((data, (i, j)), [shape=(M, N)]) 

where: 
data[:] are the entries of the matrix, in any order 
i[:] are the row indices of the matrix entries 
j[:] are the column indices of the matrix entries 

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

如何构建一个coo_matrix,使得(数据,(i,j))从磁盘进入(使用迭代器或生成器)并且磁盘上的数组/矢量对象使用.npy或pickle格式?

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

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

回答

0

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

如果这三个数组是有效的,则得到的稀疏矩阵将使用它们作为相应的属性,而不需要应对或更改。由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格式进行的。

+0

使用您的示例创建coo_matrix,内存包含对象data,rows,cols和M.问题是coo_matrix是否可以通过流行,列和数据递增创建。你的回答表明这是不可能的。 –

+0

'coo_matrix'的'__init__'代码是用Python编写的,易于操作。 'bmat'的代码,从块中建立一个'coo'矩阵也是有启发性的。 – hpaulj