我无法弄清楚如何使用CArray特征。为什么这个班级
from traits.api import HasTraits, CArray, Float,Int
import numpy as np
class Coordinate3D(HasTraits):
coordinate = CArray(Float(), shape=(1,3) )
def _coordinate_default(self):
return np.array([1.,2.,3.])
显然不使用我的_name_default()方法?
In [152]: c=Coordinate3D()
In [153]: c.coordinate
Out[153]: np.array([[ 0., 0., 0.]])
我原本期望np.array([1,2,3])! _name_default()似乎适用于Int
class A(HasTraits):
a=Int
def _a_default(self):
return 2
In [163]: a=A()
In [164]: a.a
Out[164]: 2
那我在这里做错了什么?另外,我无法分配值:
In [181]: c.coordinate=[1,2,3]
TraitError: The 'coordinate' trait of a Coordinate3D instance must be an array of
float64 values with shape (1, 3), but a value of array([ 1., 2., 3.]) <type
'numpy.ndarray'> was specified.
与
相同的错误消息In [182]: c.coordinate=np.array([1,2,3])
答案 0 :(得分:2)
一维数组和二维数组之间存在差异,其中一个维度的大小为1.您试图将一维数组设置为期望二维的CArray
特征。例如,您的默认方法应为:
def _coordinate_default(self):
return np.array([[1., 2., 3.]])
(注意额外的方括号)。您设置的数组的形状为(3,)
,而不是所需的(1, 3)
。
同样,它不会将平面列表强制转换为二维数组。尝试分配像
这样的嵌套列表c.coordinate=[[1, 2, 3]]
代替。
(或者,如果你真的想要一维数组,你应该在你的特征分配中使用shape=(3,)
,其他部分应该正常工作。)
答案 1 :(得分:0)
假的我。在从Eclipse复制粘贴到iPython时,我没有使用魔术%粘贴功能,并搞砸了那里的类定义。另一个实际错误是CArray的形状,必须是(3,)。
此代码
class Coordinate3D(HasTraits):
coordinate = CArray(Float(),shape=(3,))
def __init__(self,iv=None):
super(Coordinate3D,self).__init__()
if iv:
self.coordinate=iv
def _coordinate_default(self):
return array([1,2,3])
def __getitem__(self,index):
return self.coordinate[index]
按预期工作:
In [3]: c=Coordinate3D()
In [6]: c.coordinate
Out[6]: array([ 1., 2., 3.])
In [7]: c=Coordinate3D([1,2,5])
In [8]: c.coordinate
Out[8]: array([ 1., 2., 5.])
In [11]: c[0]
Out[11]: 1.0
答案 2 :(得分:0)
在前面的答案的扩展中,我进一步尝试了:
import types
RealNumberType = (types.IntType, types.LongType, types.FloatType)
class ScaleFactor3D(Coordinate3D):
'''Demonstrate subclassing a HasTraits class
and overriding __init__ and a _default method'''
def _coordinate_default(self):
return array([1,1,1])
def __init__(self,iv=None):
if isinstance(iv,RealNumberType):
iv=[iv,iv,iv]
super(ScaleFactor3D,self).__init__(iv)
这也很有效:
In [35]: s=ScaleFactor3D()
In [36]: s.coordinate
Out[36]: array([ 1., 1., 1.])
In [37]: s=ScaleFactor3D(3)
In [38]: s.coordinate
Out[38]: array([ 3., 3., 3.])
我以为我会把它放在这里,因为我在网上找不到有关CArray的有用信息。