2012-10-03 105 views
8

我想保存一個大的numpy數組並重新加載它。使用numpy.savenumpy.load,數組值被損壞/更改。數組的預保存和後加載的形狀和數據類型相同,但加載後數組的絕大多數值都爲零。 數組爲(22915,22915),值爲float64's,以.npy文件格式存儲3.94 gb,數據條目平均值約爲.1(不是可能合理轉換爲零的小浮點數)。我正在使用numpy 1.5.1。numpy保存/加載損壞數組

爲什麼發生這種腐敗的任何幫助將不勝感激,因爲我很茫然。以下是一些提供上述索賠證據的代碼。

In [7]: m 
Out[7]: 
     array([[ 0.  , 0.02023, 0.00703, ..., 0.02362, 0.02939, 0.03656], 
      [ 0.02023, 0.  , 0.0135 , ..., 0.04357, 0.04934, 0.05651], 
      [ 0.00703, 0.0135 , 0.  , ..., 0.03037, 0.03614, 0.04331], 
      ..., 
      [ 0.02362, 0.04357, 0.03037, ..., 0.  , 0.01797, 0.02514], 
      [ 0.02939, 0.04934, 0.03614, ..., 0.01797, 0.  , 0.01919], 
      [ 0.03656, 0.05651, 0.04331, ..., 0.02514, 0.01919, 0.  ]]) 
In [8]: m.shape 
Out[8]: (22195, 22195) 

In [12]: save('/Users/will/Desktop/m.npy',m) 

In [14]: lm = load('/Users/will/Desktop/m.npy') 

In [15]: lm 
Out[15]: 
     array([[ 0.  , 0.02023, 0.00703, ..., 0.  , 0.  , 0.  ], 
       [ 0.  , 0.  , 0.  , ..., 0.  , 0.  , 0.  ], 
       [ 0.  , 0.  , 0.  , ..., 0.  , 0.  , 0.  ], 
       ..., 
       [ 0.  , 0.  , 0.  , ..., 0.  , 0.  , 0.  ], 
       [ 0.  , 0.  , 0.  , ..., 0.  , 0.  , 0.  ], 
       [ 0.  , 0.  , 0.  , ..., 0.  , 0.  , 0.  ]]) 
In [17]: type(lm[0][0]) 
Out[17]: numpy.float64 

In [18]: type(m[0][0]) 
Out[18]: numpy.float64 

In [19]: lm.shape 
Out[19]: (22195, 22195) 
+1

你有沒有試過,或者能夠嘗試一個新版本的Numpy? – nneonneo

+0

我不能 - 1.5.1是我正在使用的其他庫的依賴項。如果它的固定版本更新(在我進行的搜索中有一些證據),那麼也許我可以嘗試升級,但顯然這可能會導致更多/其他問題。 – wdwvt1

+3

幾件事情要嘗試:1)尋找數組變爲零的位置,2)嘗試單獨打印數組的最後一行/列(以查看它是否是一個奇怪的打印問題),3)嘗試通過指定''r''作爲'load'的第二個參數來使用內存映射。 – nneonneo

回答

1

這是一個已知的issue(注意,該鏈接反對numpy 1.4)。如果你真的無法升級,我的建議是嘗試以不同的方式保存(savez,savetxt)。如果getbuffer可用,則可以嘗試直接寫入字節。如果一切都失敗(並且無法升級),則可以非常輕鬆地編寫自己的保存功能。