将csr_matrix和numpy数组保存在一个文件中

时间:2016-07-21 20:51:12

标签: python numpy scipy

我需要保存一个大的稀疏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")

两个问题:

  1. 有没有更好的方法来保存csr_matrix?
  2. 我能以某种方式将X和Y同时保存到同一个文件中吗?我为此制作两个文件似乎很疯狂。

1 个答案:

答案 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子类。