我在写一个子类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还不熟悉,那么子类化ndarrays
和MaskedArrays
并不是最简单的入门方法,到目前为止。。。
在做其他事情之前,你应该去检查一下这个tutorial。这将向您介绍子类化ndarrays
所涉及的机制。MaskedArrays
与ndarrays
一样,使用__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/