自动调整NumPy重新调整大小

时间:2011-06-19 21:57:16

标签: python numpy subclassing

我想创建一个numpy.recarray的子​​类,当数据被添加到当前长度之外的行时会自动调整大小。

以下代码完成了我想要的大部分内容。

class autorecarray(numpy.recarray):

   def __init__(self,*args,**kwargs):
      self._increment = 1
      numpy.recarray.__init__(self,args,kwargs)

   def __setitem__(self,ind,y):
      try: 
         numpy.recarray.__setitem__(self,ind,y)
      except IndexError:
         self.resize((self.__len__()+self._increment,),refcheck=False)
         self.__setitem__(ind,y)

它适用于这个用例:

a = utils.autorecarray((1,),formats=['i4','i4'])
a[1] = (1,2) # len(a) will now be 2

但是,这种用法会在numpy.core.records.recarray __getitem__方法上引发IndexError:

a[2]['f1'] = 3

我最初的尝试是覆盖子类中的__getitem__方法,但此代码不起作用。

def __getitem__(self,ind):
      try:
         numpy.recarray.__getitem__(self,ind)
      except IndexError:
         self.resize((self.__len__() + self._increment,),refcheck=False)
         self.__getitem__(ind)

它会自动展开数组,但现在数组中的每个项目都为None且无法更改。

谁能告诉我我做错了什么?

2 个答案:

答案 0 :(得分:3)

首先,您错过了numpy.recarray.__init__电话中的星号:

def __init__(self, *args, **kwargs):
    self._increment = 1
    numpy.recarray.__init__(self, *args, **kwargs)

其次,您在return:{/ p>中缺少__getitem__条话

def __getitem__(self,ind):
    try:
        return numpy.recarray.__getitem__(self,ind)
    except IndexError:
        self.resize((self.__len__() + self._increment,),refcheck=False)
        return self.__getitem__(ind)

答案 1 :(得分:2)

被覆盖的__getitem__不会返回值。

我花了很长时间才意识到这一点。

此外,正如Petr Viktorin指出的那样,您在*来电中遗漏了**__init__运营商。