我想创建一个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
且无法更改。
谁能告诉我我做错了什么?
答案 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)