2013-08-27 112 views
2

保存如果我保存使用numpy.save()企業社會責任矩陣可用csr_matrix,然後嘗試通過numpy.load加載它在(),一大量屬性消失:特別是沒有形狀,並且不可能通過索引訪問值。這是正常的嗎?爲什麼np.load不會返回由np.save

在下面的例子中,我從三個數組創建一個CSR矩陣:數據,索引和索引指針。然後保存它,將其加載回來,並演示保存版本中形狀和索引操作的失敗。

> import numpy as np 
> import scipy as sp 
> import scipy.sparse as ssp 

> wd 
Out[1]: 
array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], dtype=int16) 

> wi 
Out[1]: 
array([200003,  1, 200009, 300000, 200002, 200006, 200007, 250000, 
     300500, 200010, 300501, 200001, 200000,  0, 200008, 200004, 
     200005, 200011, 200018,  2, 200019, 200013, 300001, 200014, 
     200015, 200022, 200012, 200020, 200021, 200016, 200017, 200023, 
     200027,  2, 200030, 200032, 200028, 200033, 200031, 200029, 
     200026, 200025, 200024, 200047,  2, 200042, 200045, 200046, 
     200028, 200038, 200040, 200039, 200036, 200037, 200012, 200048, 
     200041, 200035, 200044, 200043, 200034, 200049,  3, 200050, 
      4], dtype=int32) 

> wp 
Out[1]: array([ 0, 18, 31, 43, 61, 65], dtype=int32) 

> ww = ssp.csr_matrix((wd,wi,wp)) 

> ww.shape 
Out[1]: (5, 300502) 

> ww[2,3] 
Out[1]: 0 

> ww[0,0] 
Out[1]: 1 

> np.save('/Users/bryanfeeney/Desktop/ww.npy', ww) 
> www = np.load('/Users/bryanfeeney/Desktop/ww.npy') 

> www.shape 
Out[1]:() 

> www[2,3] 
Traceback (most recent call last): 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/site-packages/IPython/core/interactiveshell.py", line 2732, in run_code 
    exec(code_obj, self.user_global_ns, self.user_ns) 
    File "<ipython-input-1-35f1349fb755>", line 1, in <module> 
    www[2,3] 
IndexError: 0-d arrays can only use a single() or a list of newaxes (and a single ...) as an index 

> www[0,0] 
Traceback (most recent call last): 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/site-packages/IPython/core/interactiveshell.py", line 2732, in run_code 
    exec(code_obj, self.user_global_ns, self.user_ns) 
    File "<ipython-input-1-43c5da404060>", line 1, in <module> 
    www[0,0] 
IndexError: 0-d arrays can only use a single() or a list of newaxes (and a single ...) as an index 

以下是python運行時,numpy和scipy的版本信息。

> sys.version 
Out[1]: '3.3.2 (default, May 21 2013, 11:50:47) \n[GCC 4.2.1 Compatible Apple Clang 4.1 ((tags/Apple/clang-421.11.66))]' 

> np.__version__ 
Out[1]: '1.7.1' 

> sp.__version__ 
Out[1]: '0.12.0' 
+0

針對該文檔的評論狀態np.load/store在陣列上工作,可能就是這樣,但是沒有任何干淨的方式存儲和加載CSR矩陣嗎?到目前爲止,我一直在使用存儲和加載數據,索引和indptr的技巧,這似乎凌亂 – Feenaboccles

+0

跨越評論和帖子。我只能看到「混亂」的方式。但其他人可能會回答 – doctorlove

+0

[可移植數據格式保存/加載scipy稀疏csr \ _matrix]可能的重複(http://stackoverflow.com/questions/8955448/save-load-scipy-sparse-csr-matrix-in-便攜式數據格式) –

回答

0

三個變量wdwiwp彌補你的稀疏矩陣。你需要保存所有這三個,因爲numpy save涉及numpy數組。
然後有他們裝,說是WWD,第一次世界大戰和WWP作出新的矩陣

new_csr = csr_matrix((wwd, wwi, wwp), shape=(M, N)) 

了類似的討論參見here

0

這似乎是一個錯誤,但你可以泡製整個稀疏矩陣對象:

import pickle 
with open('ww.pkl', 'w') as f: 
    pickle.dump(w, f) 

,當你想加載:

with open('ww.pkl') as f: 
    ww = pickle.load(f) 
+0

由於約定是對numpy格式使用'npy'擴展名,'pickle.dump'保存的文件不是*使用numpy文件格式,所以我建議在'pickle'時使用不同的文件擴展名使用(例如'pkl')。 –

+0

@WarrenWeckesser很好的觀察,我已經編輯了答案 –

相關問題