我正在尝试编写一个子类 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
所涉及的机制。
MaskedArrays
与 ndarrays
一样,使用 __new__
方法创建类实例,而不是 __init__
。当您到达子类的 __init__
时,您已经有了一个完全实例化的对象,实际的初始化委托(delegate)给了 __array_finalize__
方法。简单来说:您的 __init__
不能像您期望的那样使用标准 Python 对象。 (实际上,我想知道它是否被调用了......在 __array_finalize__
之后,如果我没记错的话......)
既然您已被警告,您可能需要考虑是否真的需要经历子类化 ndarray
的麻烦:
- 您对
gridded_array
的目标是什么? - 您应该支持
ndarrays
的所有 方法,还是只支持部分方法?所有数据类型? - 当您获取单个元素或对象的一部分时会发生什么?
- 您会广泛使用
gridded_arrays
作为 NumPy 函数的输入吗?
如果您有疑问,那么将 gridded_array
设计为采用 ndarray
(或 MaskedArray
)的通用类可能会更容易) 作为属性(例如,gridded_array._array
),并仅添加您需要在 self._array
上操作的方法。
建议
- 如果您只需要“标记”您的
gridded_array
中的每一项,您可能会对pandas 感兴趣. - 如果您只需要处理 float ,
MaskedArray
可能有点矫枉过正:只需使用nans
来表示无效数据,很多 numpy 函数都有nans
等效。在最坏的情况下,您总是可以在需要时屏蔽您的gridded_array
:使用.view(np.ma.MaskedArray)
查看ndarray
的子类> 应该返回您输入的屏蔽版本...
关于python - 如何子类化 numpy .`ma.core.masked_array` ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12597827/