加载用 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/loadmat
比 save/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/mmload
和np.read/write
相比真的很慢。 scipy.io.savemat/loadmat
比 scipy.io.mmread/mmwrite
快吗?
我从未使用过mmread
的;并且没有计时savemat
。我可以想象用savez
保存csr
矩阵,保存3 个数组(data
、indices
、indptr
属性)加上形状信息(dtype 包含在data
中)。这可能是最快最紧凑的方法,但不知道有没有人实现过。以上是关于加载用 np.save 保存的稀疏矩阵的主要内容,如果未能解决你的问题,请参考以下文章