我希望能够将我的数组子类保存到一个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数组的子类时保留自定义属性。答案涉及一个习惯.__reduce__
和.__setstate__
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句