CArray初始化和赋值有问题

2024-06-24 11:44:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我搞不懂怎么利用卡雷的特质。为什么这个班

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.])

显然没有使用我的\u name\u default()方法?你知道吗

In [152]: c=Coordinate3D()
In [153]: c.coordinate
Out[153]: np.array([[ 0.,  0.,  0.]])

我早就料到了np.数组([1,2,3])! \u name\u 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])

Tags: ofinimportnumpydefaultcoordinatenpfloat
3条回答

骗我。从Eclipse复制粘贴到iPython时,我没有使用magic%paste函数,并且弄乱了那里的类定义。另一个实际的错误是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

一维数组和其中一个维度的大小为1的二维数组之间存在差异。您正在尝试将一维数组设置为CArray特性,该特性要求二维。例如,默认方法应为:

def _coordinate_default(self):
    return np.array([[1., 2., 3.]])

(请注意额外的方括号)。您正在设置的数组的形状是(3,),而不是所需的(1, 3)。你知道吗

类似地,它不会将平面列表强制为二维数组。尝试指定嵌套列表,如

c.coordinate=[[1, 2, 3]]

相反。你知道吗

(或者,如果你真的想要一维数组,你应该在traits赋值中使用shape=(3,),其他部分应该正常工作。)

在前面答案的基础上,我做了进一步的实验:

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.])

我想我把这个放在这里,因为我在网上找不到关于凯瑞的有用信息。你知道吗

相关问题 更多 >