我需要一些基本的数据类表示,我想使用现有的numpy类,因为它们已经提供了很好的功能。
但是,我不确定这是否是这样做的方法(虽然它到目前为止有效)。所以这是一个例子:
Position
类应该像一个简单的numpy.array
,但它应该将属性.x
,.y
和.z
映射到三个数组组件。我覆盖了__new__
方法,该方法返回带有初始数组的ndarray
。为了允许访问和修改数组,我为每个属性定义了属性以及setter。
import numpy as np
class Position(np.ndarray):
"""Represents a point in a 3D space
Adds setters and getters for x, y and z to the ndarray.
"""
def __new__(cls, input_array=(np.nan, np.nan, np.nan)):
obj = np.asarray(input_array).view(cls)
return obj
@property
def x(self):
return self[0]
@x.setter
def x(self, value):
self[0] = value
@property
def y(self):
return self[1]
@y.setter
def y(self, value):
self[1] = value
@property
def z(self):
return self[2]
@z.setter
def z(self, value):
self[2] = value
然而,对于这样一个基本逻辑,这似乎有点太多代码,我想知道我是否这样做了#34;正确"办法。我还需要一堆其他类,如Direction
,这些类还有其他一些功能(改变时的自动规范等),在开始集成numpy之前,我想我问你......
答案 0 :(得分:1)
我认为ndarray在这里是错误的选择,你可能想要一个简单的命名元组。
>>> import collections
>>> Position = collections.namedtuple('Positions', 'x y z')
>>> p = Position(1, 2, 3)
>>> p
Positions(x=1, y=2, z=3)
你可以像这样解压缩
>>> x, y, z = p
>>> x, y, z
(1, 2, 3)
>>>