3

我正在尝试编写一个子类 a 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

4

2 回答 2

3

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

首先,您应该去查看本教程。这应该向您介绍子类化所涉及的机制ndarrays

MaskedArrays和 一样ndarrays,使用__new__创建类实例的方法,而不是__init__. 当你到达__init__你的子类时,你已经有了一个完全实例化的对象,实际的初始化委托给了__array_finalize__方法。简而言之:您__init__的标准 Python 对象无法正常工作。(实际上,我想知道它是否被调用...之后__array_finalize__,如果我没记错的话...

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

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

如果您有疑问,那么将 a (或 a )作为属性(例如)设计gridded_array为通用类可能会更容易,并且只添加您需要在.ndarrayMaskedArraygridded_array._arrayself._array

建议

  • 如果您只需要“标记”您的每个项目,您可能会对pandasgridded_array感兴趣。
  • 如果你只需要处理浮点数,MaskedArray可能有点矫枉过正:只是nans用来表示无效数据,很多 numpy 函数都有nans等价的。在最坏的情况下,您总是可以gridded_array在需要时屏蔽您的:查看ndarraywith的子类.view(np.ma.MaskedArray)应该返回您输入的屏蔽版本......
于 2012-09-26T10:04:57.967 回答
0

问题是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
于 2012-09-26T10:00:45.073 回答