[英]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.ma
, np.matrix
和sparse.coo_matrix
案例。 所以這可能是探索自己的子類的方向。
搜索numpy
和pickle
我發現在numpy數組的pickle子類時保留自定義屬性 。 答案涉及自定義.__reduce__
和.__setstate__
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.