繁体   English   中英

自动调整NumPy Recarray的大小

[英]Automatically resizing NumPy recarray

我想创建一个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 ,无法更改。

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

首先,您在numpy.recarray.__init__调用中缺少星号:

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

其次,您在__getitem__缺少return语句:

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)

覆盖的__getitem__不返回值。

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

同样,正如Petr Viktorin指出的那样,您在__init__调用中省略了***运算符。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM