python - 如何子类化 numpy .`ma.core.masked_array` ?

标签 python oop inheritance python-2.7 subclass

我正在尝试编写一个子类 masked_array。到目前为止我得到的是:

class gridded_array(ma.core.masked_array):
    def __init__(self, data, dimensions, mask=False, dtype=None,
                 copy=False, subok=True, ndmin=0, fill_value=None,
                 keep_mask=True, hard_mask=None, shrink=True):
        ma.core.masked_array.__init__(data, mask, dtype, copy, subok,
                                      ndmin, fill_value, keep_mask, hard_mask,
                                      shrink)
        self.dimensions = dimensions

但是,当我现在创建一个 gridded_array 时,我没有得到我期望的结果:

dims = OrderedDict()
dims['x'] = np.arange(4)
gridded_array(np.random.randn(4), dims)

masked_array(data = [-- -- -- --],
             mask = [ True  True  True  True],
             fill_value = 1e+20)

我希望有一个未屏蔽的数组。我怀疑我传递的 dimensions 参数会在 masked_array.__init__ 调用中传递,但由于我对 OOP 很陌生,所以我不知道知道如何解决这个问题。

非常感谢任何帮助。

PS:我使用的是 Python 2.7

最佳答案

一句警告:如果您是 OOP 的新手,到目前为止,子类化 ndarraysMaskedArrays 并不是最简单的入门方法。 ..

在做任何事情之前,你应该去检查一下这个 tutorial .那应该向您介绍子类化 ndarrays 所涉及的机制。

MaskedArraysndarrays 一样,使用 __new__ 方法创建类实例,而不是 __init__。当您到达子类的 __init__ 时,您已经有了一个完全实例化的对象,实际的初始化委托(delegate)给了 __array_finalize__ 方法。简单来说:您的 __init__ 不能像您期望的那样使用标准 Python 对象。 (实际上,我想知道它是否被调用了......在 __array_finalize__ 之后,如果我没记错的话......)

既然您已被警告,您可能需要考虑是否真的需要经历子类化 ndarray 的麻烦:

  • 您对gridded_array 的目标是什么?
  • 您应该支持ndarrays所有 方法,还是只支持部分方法?所有数据类型?
  • 当您获取单个元素或对象的一部分时会发生什么?
  • 您会广泛使用 gridded_arrays 作为 NumPy 函数的输入吗?

如果您有疑问,那么将 gridded_array 设计为采用 ndarray(或 MaskedArray)的通用类可能会更容易) 作为属性(例如,gridded_array._array),并仅添加您需要在 self._array 上操作的方法。

建议

  • 如果您只需要“标记”您的gridded_array 中的每一项,您可能会对pandas 感兴趣.
  • 如果您只需要处理 float ,MaskedArray 可能有点矫枉过正:只需使用 nans 来表示无效数据,很多 numpy 函数都有 nans 等效。在最坏的情况下,您总是可以在需要时屏蔽您的 gridded_array:使用 .view(np.ma.MaskedArray) 查看 ndarray 的子类> 应该返回您输入的屏蔽版本...

关于python - 如何子类化 numpy .`ma.core.masked_array` ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12597827/

相关文章:

python - 如何从另一个文件(在另一个文件夹中)包含类 - python

python - 如何使用 Python 解析和修改 .odg 文件?

php - OOP 方法链接可选返回

c++ - 将指向类对象的智能指针与类对象混合

Java 通用容器类

python - 线性回归中的交叉验证

c++ - 检查 RTTI

javascript - 为什么要使用 Object.create?

java - 通过子类包限定符导入父类的内部接口(interface)

python - 从命令行运行 Plotly 脚本