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

时间:2016-08-08 22:00:58

标签: 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

the docs说(强调我的):

  

格式明确不需要:

     
      
  • [...]
  •   
  • 完全处理numpy.ndarray的任意子类。子类将是   接受写入,但只会写出数组数据。一个   在读取文件时将创建常规numpy.ndarray对象。    API可用于构建特定子类的格式,但是   这超出了一般NPY格式的范围。
  •   

那么可以使上面的代码不引发AssertionError吗?

1 个答案:

答案 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.manp.matrixsparse.coo_matrix个案例。所以这可能是探索你自己的子类的方向。

numpypickle上搜索我找到Preserve custom attributes when pickling subclass of numpy array。答案涉及自定义.__reduce__.__setstate__