【发布时间】:2014-08-06 13:45:12
【问题描述】:
我正在从 MATLAB 迁移我的一些代码。我想知道是否存在定义某个类(3d 向量)的功能,并且可以定义此类的数组(或列表?)。我希望能够在这个数组上使用切片操作。
例如,MATLAB 有这个功能:
obj = class(s,'class_name')
使用struct s 作为模式创建一个类class_name 对象数组以确定obj 的大小。
我了解 numpy 提供了数组操作所需的一切。我现在正在努力学习,这只是一个例子。所以,我想在没有 numpy 数组的情况下做到这一点。
我以这种方式接近它可能是完全错误的,所以如果有更好的方法可以做到这一点,请随时提出建议。我正在研究子类化 ndarray,但这似乎我只是再次创建一个数组。非常感谢任何建议。
到目前为止我的代码:
class vector3d(object):
def __init__(self,*args):
nargs = len(args);
if(nargs == 0): # Null Vector
self.x = None; self.y = None; self.z = None;
elif(nargs==1):
if (type(args[0]) is vector3d):
self = args[0];
elif(type(args[0]) is np.ndarray):
Vec = args[0];
if (np.shape(Vec)[0]==1 or np.shape(Vec)[1]==1):
if (np.shape(Vec) == (3,1)):
self.x = Vec[0,0]; self.y = Vec[1,0];
self.z = Vec[2,0];
elif (np.shape(Vec) == (1,3)):
self.x = Vec[0,0]; self.y = Vec[0,1];
self.z = Vec[0,2];
else:
raise Exception('Wrong Type of Inputs');
else:
raise Exception('Wrong Type of Inputs');
VecArray = np.ndarray((10,), dtype=np.object);
print np.shape(VecArray);
for i in range(10):
print i;
VecArray[i] = vector3d(np.random.rand(3,1));
运行代码后,当我尝试以下操作时:
>>> VecArray[1].x
>>> 0.36923808713820772
>>> VecArray[1:5].x
AttributeError Traceback (most recent call last)
<ipython-input-92-899463ad0461> in <module>()
----> 1 VecArray[1:5].x
AttributeError: 'numpy.ndarray' object has no attribute 'x'
我知道我可以列出对象。我应该更具体。我想得到一个可索引的变量作为输出。例如,没有将上述内容视为错误的内容。
【问题讨论】:
-
您可以将任何您想要的内容放入常规 Python 列表中,包括您的自定义类的实例。
-
你有没有尝试过什么?
-
@timgeb:所以我只是定义一个类并列出该类?如果我想将 numpy 数组作为输入传递给类怎么办?理想情况下,我希望它输出类的列表(或数组)。例如,如果我输入 numpy 3X10 浮点数组。我想要一个包含 10 个 vector3d 对象的列表。这可以在类的定义中完成吗?
-
@Lidtke:是的,我尝试过自己定义类。我一直在试图弄清楚如何处理数组输入。正如我已经提到的,我也在尝试继承 ndarray。但这只是最终创建了另一个 vector3d 类型的数组。
-
它(最终)是有道理的,但我认为它(很容易)不可能——切片返回一个容器,该容器与内部对象的属性不同。您也许可以创建一些自定义容器来实现
__getattr__并检查其内容以查找它本身没有的任何属性,但这是很多工作。