我想继承numpy recarrays并能够从该类创建视图。例如:
_Theta = np.dtype([('v', '<f8'), ('a', '<f8'), ('w', '<f8')])
class Theta(np.recarray):
''' Defines a class for the parameters of a DDM model. '''
def __new__(clc, shape=1):
return np.recarray.__new__(clc, shape, _Theta)
如果我创建一个实例,它会生成我想要的结果。
In [12]: r = Theta()
In [13]: r
Out[13]:
Theta([(6.91957786449907e-310, 2.9958354e-316, 2.0922526e-316)],
dtype=[('v', '<f8'), ('a', '<f8'), ('w', '<f8')])
但是,如果我尝试创建课程视图,我会得到以下内容:
In [11]: np.zeros(3).view(Theta).a
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-11-b9bdab6cd66c> in <module>()
----> 1 np.zeros(3).view(Theta).a
/usr/lib/python2.7/dist-packages/numpy/core/records.pyc in __getattribute__(self, attr)
414 res = fielddict[attr][:2]
415 except (TypeError, KeyError):
--> 416 raise AttributeError("record array has no attribute %s" % attr)
417 obj = self.getfield(*res)
418 # if it has fields return a recarray, otherwise return
AttributeError: record array has no attribute a
是否可以创建一个数组视图,以便我可以使用我为Theta定义的属性来解决它们? (我认为这应该通过 array_finalize 方法以某种方式完成,但我不知道如何)。
答案 0 :(得分:0)
你可以这样做:
import numpy as np
class Theta(np.recarray):
''' Defines a class for the parameters of a DDM model.
'''
def __new__(clc, *args, **kwargs):
a = np.atleast_2d(np.array(*args, **kwargs))
dtype = np.dtype([('v', '<f8'), ('a', '<f8'), ('w', '<f8')])
r = np.recarray(shape=a.shape[0], dtype=dtype)
r.v = a[:,0]
r.a = a[:,1]
r.w = a[:,2]
return r.view(Theta)
r = Theta([[1,2,3],[1,2,3]])
这样:
a = Theta(np.zeros(3))
会做你想做的事情......这可能需要额外的检查,如:
assert a.shape[1] % 3 == 0