我正在尝试编写一个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的子类应该返回输入的遮罩版本…