我希望能够将我的数组子类保存到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
Run Code Online (Sandbox Code Playgroud)
文档说(强调我的):
格式明确不需要:
- [...]
- 完全处理numpy.ndarray的任意子类.将接受子类进行写入,但只会写出数组数据.读取文件后将创建一个常规的numpy.ndarray对象. API可用于为特定子类构建格式,但这超出了一般NPY格式的范围.
那么是否可以使上面的代码不引发AssertionError?
我没有看到np.save
处理数组子类的证据。
我试图用它保存一个np.matrix
,并返回一个ndarray
。
我尝试保存np.ma
数组,但出现错误
NotImplementedError: MaskedArray.tofile() not implemented yet.
Run Code Online (Sandbox Code Playgroud)
保存是由 完成的np.lib.npyio.format.write_array
,它确实
_write_array_header() # save dtype, shape etc
Run Code Online (Sandbox Code Playgroud)
ifdtype
是它使用的对象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)
Run Code Online (Sandbox Code Playgroud)
此pickle
转储/加载序列适用于测试np.ma
和np.matrix
案例sparse.coo_matrix
。所以这可能是你自己的子类探索的方向。
搜索后numpy
,pickle
我发现Preserve custom attribute when pickling subclass of numpy array。答案涉及到习惯.__reduce__
和.__setstate__
。
归档时间: |
|
查看次数: |
325 次 |
最近记录: |