我需要一些基本的数据类表示,我想使用现有的 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
然而,对于这样一个基本逻辑,这似乎有点太多代码,我想知道我是否以“正确”的方式来做。我还需要一堆其他类,如 Direction
,它们将具有许多其他功能(更改时自动规范等),在我开始集成 numpy 之前,我想我问你......
最佳答案
我认为 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)
>>>
关于python - 子类化和扩展 numpy.ndarray,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26224794/