我在写一个子类amasked_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:我在Python2.7上

最佳答案

警告:如果你对OOP还不熟悉,那么子类化ndarraysMaskedArrays并不是最简单的入门方法,到目前为止。。。
在做其他事情之前,你应该去检查一下这个tutorial。这将向您介绍子类化ndarrays所涉及的机制。
MaskedArraysndarrays一样,使用__new__方法创建类实例,而不是__init__。当您到达子类的__init__时,您已经有了一个完全实例化的对象,实际的初始化委托给了__array_finalize__方法。简单地说:您的__init__并不像您对标准Python对象所期望的那样工作。(实际上,我想知道它是否被调用了。。。在__array_finalize__之后,如果我记得正确的话…)
现在您已经收到警告,您可能需要考虑是否真的需要经历子类化andarray的麻烦:
您的gridded_array目标是什么?
您应该支持所有ndarrays方法,还是只支持一些?所有类型?
当你取一个元素或一片物体时会发生什么?
你会广泛使用gridded_arrays作为NumPy函数的输入吗?
如果您有疑问,那么将gridded_array设计为一个以ndarray(或MaskedArray)为属性(例如,gridded_array._array)的泛型类可能会更容易,并且只添加您在self._array上操作所需的方法。
建议
如果您只需要“标记”您的gridded_array中的每一项,您可能会对pandas感兴趣。
如果只需要处理浮点数,MaskedArray可能有点过头了:只需使用nans来表示无效数据,许多numpy函数都具有等效的nans值。最坏的情况是,您可以在需要时屏蔽您的gridded_array:查看带有ndarray.view(np.ma.MaskedArray)子类应返回您输入的屏蔽版本。。。

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

10-10 22:50