我试图写一个子类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__
打电话,但因为我是很新的面向对象,我不知道如何解决这个问题。
任何帮助是极大的赞赏。
PS:我在Python 2.7版
提醒一句:如果你是全新的,以面向对象,继承ndarrays
和MaskedArrays
是不是一个最简单上手,到目前为止...
任何事情之前,你应该去看看这个教程 。 这应该把你介绍给参与子类的机制ndarrays
。
MaskedArrays
,像ndarrays
,使用__new__
用于创建类的实例,而不是方法__init__
。 通过你到达的时间__init__
你的子类的,你已经有了一个完全实例化对象,与下放给实际的初始化__array_finalize__
方法。 简单来说:你的__init__
不工作,你会用标准的Python对象的期望。 ( 实际上,我不知道是否就是所谓的在所有...之后__array_finalize__
,如果我没有记错...)
现在,你已经被警告,你可能要考虑是否真的需要经过一个子类的麻烦ndarray
:
- 什么是你自己的目标
gridded_array
? - 如果你支持的所有方法
ndarrays
一部分还是? 所有dtypes? - 当你把一个单一的元素或者对象的切片应该发生什么?
- 您将使用
gridded_arrays
广泛作为NumPy的功能投入?
如果你有疑问,那么它可能是更容易设计gridded_array
作为一个通用类,需要一个ndarray
(或MaskedArray
)的属性(比如说, gridded_array._array
),和只添加方法,你需要在你的工作self._array
。
建议
- 如果你只需要在“标签”您的每一个项目
gridded_array
,你可能感兴趣的大熊猫 。 - 如果你只需要对付的花车,
MaskedArray
可能是有点矫枉过正:只要使用nans
表示无效数据,很多numpy的功能有nans
等价物。 在最坏的情况,你总是可以掩盖你的gridded_array
需要的时候:采取的一个子类的视图ndarray
与.view(np.ma.MaskedArray)
应该返回您输入的蒙面版本...
问题是, 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