我需要保存一个大的稀疏csr_matrix和一个numpy数组,以便以后能够读回它们。设X为稀疏csr_matrix,Y为数字数组。
目前我采取以下有点疯狂的路线。
from scipy.sparse import csr_matrix
import numpy as np
def save_sparse_csr(filename,array):
np.savez(filename,data = array.data ,indices=array.indices,
indptr =array.indptr, shape=array.shape )
def load_sparse_csr(filename):
loader = np.load(filename)
return csr_matrix(( loader['data'], loader['indices'], loader['indptr']),
shape = loader['shape'])
save_sparse_csr("file1", X)
np.save("file2", Y)
然后,当我想要阅读它们时:
X = load_sparse_csr("file1.npz")
Y = np.load("file2.npy")
两个问题:
答案 0 :(得分:0)
因此,您要保存csr
的3个数组属性及其形状。这足以重新创建数组,对吗?
这有什么问题?即使你找到一个为你保存csr
的函数,我敢打赌它也在做同样的事情 - 保存那些相同的数组。
Python保存类的常规方法是pickle
它。但是这个类必须创建适当的pickle方法。 numpy
执行此操作(基本上是save
函数)。但据我所知scipy.sparse
没有提供。
由于scipy.sparse
的根源在于MATLAB稀疏代码(以及为线性代数问题开发的C / Fortran代码),因此可以使用loadmat/savemat
函数进行加载/保存。我必须仔细检查,但我认为使用csc
默认的MATLAB稀疏格式。
除了处理稀疏之外,还有一个或两个sparse.io
模块,但我已经使用过。存在用于在具有相同问题的不同包之间共享稀疏数组的格式(例如PDE或有限元)。这些格式很可能会使用coo
兼容的布局(数据,行,列),可以是3个数组,3列的csv,也可以是2d数组。
提及coo
格式提出了另一种可能性。使用data, row, col
字段创建结构数组,并使用np.save
甚至np.savetxt
。我认为它不比csr
直接更快或更干净。但它确实将所有数据放在一个数组中(但shape
可能仍需要一个单独的条目。)
您也可以挑选dok
格式,因为它是dict
子类。