【发布时间】:2016-02-26 04:30:47
【问题描述】:
我编写了一个数据容器类,它本质上包含一个 numpy ndarray 成员以及生成 time_series 掩码/横截面掩码的方法,在环形缓冲区模式下获取日期索引(行#),处理调整大小,记住数据可能是一个环形缓冲区,并对形状/尺寸等实施限制。
由于我的类实现,现在我必须通过显式引用 *.data 成员来访问此对象包装的数据。这很麻烦,我想在我的类中实现 [] 运算符,这样当在我的类的实例上调用时,它引用底层 ndarray 对象上的相同操作。我怎样才能做到这一点?
def MyArray(object):
def __init__(self, shape, fill_value, dtype):
self.shape = shape
self.fill_value = fill_value
self.dtype = dtype
self.data = numpy.empty(shape, fill_value=fill_value, dtype=dtype)
def reset(self, fill_value=None):
self.data.fill(fill_value or self.fill_value)
def resize(self, shape):
if self.data.ndim != len(shape): raise Exception("dim error")
if self.data.shape < shape: raise Exception("sizing down not permitted")
# do resizing
现在,如果我想在其他地方使用这个容器,我必须这样使用它:
arr = MyArray(shape=(10000,20), fill_value=numpy.nan, dtype='float')
arr.data[::10] = numpy.NAN
msk = numpy.random.randn(10000,20)<.5
arr.data[~msk] = -1.
我每次使用时都需要显式引用 arr.data 太麻烦且容易出错(我在很多地方都忘记了 .data 后缀)。
我有什么办法可以添加一些运算符,以便 arr 上的切片和索引实际上在 arr.data 上运行隐式?
【问题讨论】:
-
你必须实现
__getitem__属性 -
这适用于在 LHS 和 RHS 上使用 arr 的情况吗?
-
@Mindstorm 如果你分配给它,那就是
__setitem__。只需将参数传递给self.data。 -
self.data.fill(fill_value or self.fill_value)- 如果有人想用零填充它怎么办? -
感谢您指出这一点。我忽略了这一点! :|
标签: python python-2.7 numpy multidimensional-array slice