如何继承numpy.`ma.core.masked_array`?(How to subclass

2019-09-23 00:59发布

我试图写一个子类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__打电话,但因为我是很新的面向对象,我不知道如何解决这个问题。

任何帮助是极大的赞赏。

PS:我在Python 2.7版

Answer 1:

提醒一句:如果你是全新的,以面向对象,继承ndarraysMaskedArrays是不是一个最简单上手,到目前为止...

任何事情之前,你应该去看看这个教程 。 这应该把你介绍给参与子类的机制ndarrays

MaskedArrays ,像ndarrays ,使用__new__用于创建类的实例,而不是方法__init__ 。 通过你到达的时间__init__你的子类的,你已经有了一个完全实例化对象,与下放给实际的初始化__array_finalize__方法。 简单来说:你的__init__不工作,你会用标准的Python对象的期望。 ( 实际上,我不知道是否就是所谓的在所有...之后__array_finalize__ ,如果我没有记错...)

现在,你已经被警告,你可能要考虑是否真的需要经过一个子类的麻烦ndarray

  • 什么是你自己的目标gridded_array
  • 如果你支持的所有方法ndarrays一部分还是? 所有dtypes?
  • 当你把一个单一的元素或者对象的切片应该发生什么?
  • 您将使用gridded_arrays广泛作为NumPy的功能投入?

如果你有疑问,那么它可能是更容易设计gridded_array作为一个通用类,需要一个ndarray (或MaskedArray )的属性(比如说, gridded_array._array ),和只添加方法,你需要在你的工作self._array

建议

  • 如果你只需要在“标签”您的每一个项目gridded_array ,你可能感兴趣的大熊猫 。
  • 如果你只需要对付的花车, MaskedArray可能是有点矫枉过正:只要使用nans表示无效数据,很多numpy的功能有nans等价物。 在最坏的情况,你总是可以掩盖你的gridded_array需要的时候:采取的一个子类的视图ndarray.view(np.ma.MaskedArray)应该返回您输入的蒙面版本...


Answer 2:

问题是, masked_array使用__new__而不是__init__ ,让你的dimensions参数是被曲解。

要覆盖__new__ ,使用方法:

class gridded_array(ma.core.masked_array):
    def __new__(cls, data, dimensions, *args, **kwargs):
        self = super(gridded_array, cls).__new__(cls, data, *args, **kwargs)
        self.dimensions = dimensions
        return self


文章来源: How to subclass numpy.`ma.core.masked_array`?