【发布时间】:2014-12-01 05:14:17
【问题描述】:
我需要一些基本的数据类表示,并且我想使用现有的 numpy 类,因为它们已经提供了很好的功能。
但是,我不确定这是否是这样做的方法(尽管到目前为止它仍然有效)。所以这里是一个例子:
Position 类应该像一个简单的numpy.array,但它应该将属性.x、.y 和.z 映射到三个数组组件。我用初始数组覆盖了 __new__ 方法,该方法返回 ndarray。为了允许访问和修改数组,我为每个属性定义了属性和设置器。
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 之前,我想我问你……
【问题讨论】:
-
到目前为止,您所拥有的看起来很像 pandas.dataframe(不是我自己与他们合作过的......)。否则它看起来很标准。
-
哪个对你更重要,代表一个点,还是用数千个点做数学?我会开始使用
(N,3)数组(或(3,N)),然后编写一些函数来访问选定的列。 -
对我来说最重要的是如何正确扩展
ndarray,如标题所示。Position只是一个小例子。
标签: python numpy subclassing multidimensional-array