python-如何继承numpy.`ma.core.masked_array`?

我正在尝试编写一个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的新手,那么到目前为止,子类化ndarrays和MaskedArrays并不是最简单的入门方法.

首先,您应该检查tutorial.这应该向您介绍子数组ndarrays涉及的机制.

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

受到警告后,您可能需要考虑是否真的需要经历子类化ndarray的麻烦:

>您的gridded_array的目标是什么?
>您应该支持所有ndarray方法,还是仅支持某些方法?所有dtypes?
>当您采用单个元素或对象的一部分时会发生什么?
>您会广泛使用gridded_arrays作为NumPy函数的输入吗?

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

意见建议

>如果仅需要“标记” gridded_array的每个项目,则可能对pandas感兴趣.
>如果只需要处理浮点数,那么MaskedArray可能会有点过大:仅使用nans表示无效数据,许多numpy函数具有与nans等效的功能.最糟糕的是,您总是可以在需要时遮罩gridded_array:使用.view(np.ma.MaskedArray)查看ndarray的子​​类应该返回输入的遮罩版本…

上一篇:如何在不违反OO核心原则的情况下使用Fragments?


下一篇:java-不知道如何创建一个菜单,该菜单使用其他类的方法