加载用 np.save 保存的稀疏矩阵

Posted

技术标签:

【中文标题】加载用 np.save 保存的稀疏矩阵【英文标题】:loading a sparse matrix saved with np.save 【发布时间】:2016-02-12 07:21:55 【问题描述】:

我使用np.save('X', X) 保存了一个 scipy csr 矩阵。当我用np.load('X.npy') 加载它时,我得到了这个签名:

array(<240760x110493 sparse matrix of type '<class 'numpy.float64'>' with 20618831 stored elements in Compressed Sparse Row format>, dtype=object)

但是,我无法使用索引访问这些数据(例如X[0,0]X[:10,:10] or X[0] 都给出错误IndexError: too many indices for array)并且调用.shape 返回()

有没有办法访问这些数据,还是现在已经损坏了?

编辑。

由于有 3 个选项可以保存/加载矩阵,因此我进行了速度比较,看看哪个最适合我的稀疏矩阵:

编写稀疏矩阵:

%timeit -n1 scipy.io.savemat('tt', 't': X)
1 loops, best of 3: 66.3 ms per loop

timeit -n1 scipy.io.mmwrite('tt_mm', X)
1 loops, best of 3: 7.55 s per loop

timeit -n1 np.save('tt_np', X)
1 loops, best of 3: 188 ms per loop

读取稀疏矩阵:

timeit -n1 scipy.io.loadmat('tt')
1 loops, best of 3: 9.78 ms per loop

%timeit -n1 scipy.io.mmread('tt_mm')
1 loops, best of 3: 5.72 s per loop

%timeit -n1 np.load('tt_np.npy')
1 loops, best of 3: 150 ms per loop

结果是 mmread/mmwrite 非常低(慢了约 100 倍),savemat/loadmatsave/load 快 3-10 倍。

【问题讨论】:

【参考方案1】:

让我们注意打印中的所有线索

array(<240760x110493 sparse matrix of type '<class 'numpy.float64'>'
     with 20618831 stored elements in Compressed Sparse Row format>, dtype=object)

最外层:

array(....,dtype=object)

稀疏矩阵不是正则数组;到np.save,它只是一个 Python 对象。所以它将它包装在dtype=object 中并保存了它。它是一个 0d 数组(因此是 () 形状),因此所有索引尝试都失败了。试试吧

M=arr.item() # or
M=arr[()]

现在M 应该显示为:

sparse matrix of type '<class 'numpy.float64'>'
     with 20618831 stored elements in Compressed Sparse Row format

具有M.shape 之类的属性。 M.A 将显示密集形式,因为它太大而无法有效地执行此操作。

【讨论】:

谢谢!那行得通。我从来没有想过一个 python 对象是一个 0-d 数组。 是的,0d 数组对我们所有人来说都有些牵强。好在他们没有尝试实施负维度。 :) scipy.io.savemat/loadmat 知道如何以 MATLAB 兼容的格式保存和加载稀疏矩阵。 我试过scipy.io.mmread/mmloadnp.read/write 相比真的很慢。 scipy.io.savemat/loadmatscipy.io.mmread/mmwrite 快吗? 我从未使用过mmread 的;并且没有计时savemat。我可以想象用savez 保存csr 矩阵,保存3 个数组(dataindicesindptr 属性)加上形状信息(dtype 包含在data 中)。这可能是最快最紧凑的方法,但不知道有没有人实现过。

以上是关于加载用 np.save 保存的稀疏矩阵的主要内容,如果未能解决你的问题,请参考以下文章

Python的稀疏矩阵和参数保存 save/load

将稀疏 scipy 矩阵加载到现有的 numpy 密集矩阵中

Scipy---6.稀疏矩阵

稀疏矩阵及其压缩格式

将大型 csv 转换为稀疏矩阵以在 sklearn 中使用

将一个 numpy 稀疏矩阵保存到文件中