python - 子类化和扩展 numpy.ndarray

标签 python numpy subclassing multidimensional-array

我需要一些基本的数据类表示,我想使用现有的 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/

相关文章:

python - 嵌套数据类听写

python - 值未通过 tkinter 中的按钮传递

python - PIL 消除颜色区域之间的颜色混合

python - 在 python ndarray 中查找重复行的索引

java - 如何正确扩展Java FilterOutputStream类?

iphone - 来自图像的自定义 UIToolBar

iphone - 子类化 NSMutableDictionary

python - 从多表维基百科中抓取一张表

python - 在 python 3 中打印到一个空文件

numpy - 拆分数字并分配给 numpy 数组中的行中的元素