如何垂头丧气numpy.ndarray

How to downcast numpy.ndarray

背景:在我的程序中,numpy.ndarrays用于存储不同的东西(场、材料、几何、参数等)。通常一件事是从另一件事计算出来的,结果被传递给下一个函数。如果我在管道的某个地方忘记了一个步骤,任何进一步的计算都变得毫无意义,所以我想使用更严格的类型检查来避免错误。

我引入了几个新类型,所有这些本质上都是 ndarray:

的新名称
class Field(np.ndarray):
  pass

class Geometry(np.ndarray):
  pass

现在我可以方便地isinstance检查传递给函数的类型是否正确。

但是我在创建这些对象时遇到了问题。通常它们应该是一些 numpy 操作的结果,所以在函数结束时,我想将 np.ndarray 转换为 Field 对象。然而,仅编写 Field(v) 会调用 nparray 构造函数,该构造函数失败,因为 v 被解释为形状而不是数据。此外,我不想创建一个新对象,我不想复制任何东西我只想更改类型。通常,这不是一个好主意,但就我而言,我知道 Field 只不过是具有不同名称的 ndarray,所以它应该可以工作。

那么将 ndarray 显式转换为 Field 对象的最佳方法是什么?

奖金问题:如果我 np.savenp.load 我的子类对象,类型不会保留,我只读取 ndarray。有推荐的(有效的)替代品吗?

我刚刚发现 numpy 文档已经描述了这个具体案例:

https://docs.scipy.org/doc/numpy-1.13.0/user/basics.subclassing.html