构建scipy稀疏矩阵的最佳方法之一是使用coo_matrix方法,即
[].push(element)
但是,如果矩阵非常大,将整个i,j和数据向量加载到内存中是不切实际的。
如何构建一个coo_matrix,以便(数据,(i,j))从磁盘(带有迭代器或生成器)从磁盘提供,并且磁盘上的数组/向量对象是.npy或pickle格式?
Pickle是更好的选择,因为numpy.save/load没有针对scipy稀疏进行优化。也许还有另一种更快的格式。
numpy.genfromtext()和numpy.loadtxt()都是繁琐,缓慢和内存耗尽的。
答案 0 :(得分:0)
我不太明白。如果i, j, data
数组太大而无法创建或加载到内存中,那么它们太大而无法创建稀疏矩阵。
如果这三个数组有效,则生成的稀疏矩阵将使用它们而不进行复制或更改,作为相应的属性。由csr
构造的coo
矩阵可能更紧凑,因为其indptr
数组每行有一个值。 data
和indices
数组的大小与coo
相同(给定或者给出重复数据和排序)。
dok
和lil
格式可用于增量矩阵创建,但从长远来看,它们不会节省内存。两者仍然必须为每个非零数据点都有一个条目。在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
格式执行的。