如何让np.save为ndarray子类工作?

Eri*_*ric 6 python numpy

我希望能够将我的数组子类保存到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?

hpa*_*ulj 4

我没有看到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.manp.matrix案例sparse.coo_matrix。所以这可能是你自己的子类探索的方向。

搜索后numpypickle我发现Preserve custom attribute when pickling subclass of numpy array。答案涉及到习惯.__reduce__.__setstate__