【发布时间】:2019-10-06 00:39:42
【问题描述】:
背景:在我的程序中,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.save 和 np.load 我的子类对象,则不会保留类型,我只读取了 ndarray。有推荐的(有效的)替代方案吗?
【问题讨论】:
标签: python types casting numpy-ndarray