我希望能够将我的数组子类保存到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
the docs说(强调我的):
格式明确不需要:
- [...]
- 完全处理numpy.ndarray的任意子类。子类将是 接受写入,但只会写出数组数据。一个 在读取文件时将创建常规numpy.ndarray对象。 API可用于构建特定子类的格式,但是 这超出了一般NPY格式的范围。
那么可以使上面的代码不引发AssertionError吗?
答案 0 :(得分:3)
我没有看到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
上搜索我找到Preserve custom attributes when pickling subclass of numpy array。答案涉及自定义.__reduce__
和.__setstate__
。