簡體   English   中英

如何讓np.save為ndarray子類工作?

[英]How can I make np.save work for an ndarray subclass?

我希望能夠將我的數組子類保存到npy文件中,並在以后恢復結果。

就像是:

>>> class MyArray(np.ndarray): pass
>>> data = MyArray(np.arange(10))
>>> np.save('fname', data)
>>> data2 = np.load('fname')
>>> assert isinstance(data2, MyArray)  # raises AssertionError

文檔說(強調我的):

格式明確不需要:

  • [...]
  • 完全處理numpy.ndarray的任意子類。 將接受子類進行寫入,但只會寫出數組數據。 讀取文件后將創建一個常規的numpy.ndarray對象。 API可用於為特定子類構建格式 ,但這超出了一般NPY格式的范圍。

那么是否可以使上面的代碼不引發AssertionError?

我沒有看到np.save處理數組子類的證據。

我試圖用它保存一個np.matrix ,並找回了一個ndarray

我試圖保存一個np.ma數組,並得到一個錯誤

NotImplementedError: MaskedArray.tofile() not implemented yet.

保存是由np.lib.npyio.format.write_array完成的

_write_array_header()   # save dtype, shape etc

如果dtype是對象,它使用pickle.dump(array, fp ...)

否則它array.tofile(fp) tofile處理寫入數據緩沖區。

我認為數組的pickle.dump最終使用np.save ,但我不記得是如何觸發的。

我可以例如pickle一個數組,並加載它:

In [657]: f=open('test','wb')
In [658]: pickle.Pickler(f).dump(x)
In [659]: f.close()
In [660]: np.load('test')
In [664]: f=open('test','rb')
In [665]: pickle.load(f)

這個pickle轉儲/加載序列適用於測試np.manp.matrixsparse.coo_matrix案例。 所以這可能是探索自己的子類的方向。

搜索numpypickle我發現在numpy數組的pickle子類時保留自定義屬性 答案涉及自定義.__reduce__.__setstate__

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM