从ndarray继承称为__getitem__

Mag*_*n88 5 python numpy

嗨,我正在尝试从ndarray派生一个类.我坚持在docs中找到的配方,但当我遇到一个getiem()函数时,我得到一个我不明白的错误.我确定这是应该如何工作但我不明白如何正确地做到这一点.基本上添加"dshape"属性的我的类看起来像:

class Darray(np.ndarray):
    def __new__(cls, input_array, dshape, *args, **kwargs):
        obj = np.asarray(input_array).view(cls)
        obj.SelObj = SelObj
        obj.dshape = dshape
        return obj

    def __array_finalize__(self, obj):
        if obj is None: return
        self.info = getattr(obj, 'dshape', 'N')  

    def __getitem__(self, index):        
        return self[index]
Run Code Online (Sandbox Code Playgroud)

当我现在尝试做的时候:

D = Darray( ones((10,10)), ("T","N"))
Run Code Online (Sandbox Code Playgroud)

解释器将以最大深度递归失败,因为他一遍又一遍地调用getitem.

有人可以向我解释为什么以及如何实现getitem功能?

欢呼,大卫

Fre*_*Foo 8

有人可以向我解释为什么以及如何实现getitem功能?

对于您当前的代码,__getitem__不需要a.SelObj我删除__getitem__实现时,您的类工作正常(除了未定义).

最大递归深度误差的原因是定义__getitem__,它使用self[index]:简写符号self.__getitem__(index).如果必须覆盖__getitem__,请确保调用以下的超类实现__getitem__:

def __getitem__(self, index):
    return super(Darray, self).__getitem__(index)
Run Code Online (Sandbox Code Playgroud)

至于你为什么要这样做:有很多理由来覆盖这个函数,例如你可能将名字与数组的行相关联:

class NamedRows(np.ndarray):
    def __new__(cls, rows, *args, **kwargs):
        obj = np.asarray(*args, **kwargs).view(cls)
        obj.__row_name_idx = dict((n, i) for i, n in enumerate(rows))
        return obj

    def __getitem__(self, idx):
        if isinstance(idx, basestring):
            idx = self.__row_name_idx[idx]
        return super(NamedRows, self).__getitem__(idx)
Run Code Online (Sandbox Code Playgroud)

演示:

>>> a = NamedRows(["foo", "bar"], [[1,2,3], [4,5,6]])
>>> a["foo"]
NamedRows([1, 2, 3])
Run Code Online (Sandbox Code Playgroud)