對於mmwrite
答案的所有投票,我很驚訝沒有人試圖回答實際問題。但由於它已被重新激活,我會試一試。
這再現了OP的情況:
In [90]: x=sparse.csr_matrix(np.arange(10).reshape(2,5))
In [91]: np.save('save_sparse.npy',x)
In [92]: X=np.load('save_sparse.npy')
In [95]: X
Out[95]:
array(<2x5 sparse matrix of type '<type 'numpy.int32'>'
with 9 stored elements in Compressed Sparse Row format>, dtype=object)
In [96]: X[()].A
Out[96]:
array([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9]])
In [93]: X[()].A
Out[93]:
array([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9]])
In [94]: x
Out[94]:
<2x5 sparse matrix of type '<type 'numpy.int32'>'
with 9 stored elements in Compressed Sparse Row format
的[()]
是`user4713166給我們不是一個「硬辦法」提取稀疏數組。
np.save
和np.load
被設計爲在ndarrays上運行。但是稀疏矩陣不是這樣一個數組,也不是一個子類(如np.matrix
)。看起來np.save
將非數組對象封裝在object dtype array
中,並將其與對象的pickle形式一起保存。
當我試圖保存不同類型的對象,一個不能被酸洗,我得到一個錯誤信息在:
403 # We contain Python objects so we cannot write out the data directly.
404 # Instead, we will pickle it out with version 2 of the pickle protocol.
- > 405和pickle.dump(陣列,FP,協議= 2)
所以在回答Is Scipy smart enough to understand that it has loaded a sparse array?
時,沒有。 np.load
不知道稀疏數組。但np.save
足夠聰明,可以在給定不是數組的情況下進行遊戲,並且np.load
可以在文件中發現它時做到這一點。
至於保存和加載稀疏數組的替代方法,io.savemat
,兼容MATLAB的方法已被提及。這將是我的第一選擇。但是這個例子也表明你可以使用常規的Python pickling
。如果您需要保存特定的稀疏格式,這可能會更好。如果您能接受[()]
提取步驟,那麼np.save
並不差。 :)
https://github.com/scipy/scipy/blob/master/scipy/io/matlab/mio5.py write_sparse
- 稀疏保存在csc
格式。與標題一起,它節省了A.indices.astype('i4'))
,A.indptr.astype('i4'))
,A.data.real
,以及可選的A.data.imag
。
在快速測試我發現np.save/load
處理所有稀疏格式,除了dok
,其中load
報告缺少shape
。否則,我在稀疏文件中找不到任何特殊的酸洗代碼。
+1,'scipy.io'是正確的解決方案。我想補充一點,如果你想要走優化之路,你可以考慮'numpy.load(mmap_mode ='r'/'c')'。內存映射磁盤上的文件會給即時加載**和**節省內存,因爲可以在多個進程間共享相同的內存映射陣列。 – Radim 2011-07-19 21:07:57
scipy.io.savemat可能是最好的 – mathtick 2013-03-27 15:11:10
使用np_savez代替mm將大稀疏矩陣的加載時間從8min47減少到3s!謝謝 !我也試過savez_compressed,但大小是一樣的,加載時間更長。 – MatthieuBizien 2014-03-01 02:38:03