python – numpy的子类的数组

我有个问题.问题是:我想创建一个numpy数组的子类,然后创建该类型的对象数组.当我引用该数组中的一个项目时,我希望它仍然是该子类的一个实例.相反,它是numpy数组的一个实例.

这是一个失败的测试:

import numpy as np


class ImageWrapper(np.ndarray):

    def __new__(cls, image_data):
        assert image_data.ndim in (2, 3)
        return image_data.view(cls)

    @property
    def n_colours(self): 
        return 1 if self.ndim==2 else self.shape[2]


n_frames = 10
frames = [ImageWrapper(np.random.randint(255, size = (20, 15, 3)).astype('uint8')) for _ in xrange(n_frames)]
video = np.array(frames)
assert video[0].n_colours == 3

给我:AttributeError:’numpy.ndarray’对象没有属性’n_colours’

我怎样才能做到这一点?

事情已经尝试过:

>在构造视频时设置subok = True – 这仅在从子类对象的单个实例而不是列表构造数组时有效.
>设置dtype = object或dtype = ImageWrapper不起作用

我认识到我可以将视频列为一个列表,但出于其他原因,最好将其保存为numpy数组.

最佳答案
无论你想要实现什么,有可能比继承ndarray更好的方法.但是考虑到这一点,你可以让你的数组属于object类型,尽管在创建它时你必须要小心.这有效:

>>> video = np.empty((len(frames),), dtype=object)
>>> video[:] = frames
>>> video[0].n_colours
3

但这不是:

>>> video = np.array(frames, dtype=object)
>>> video[0].n_colours
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'numpy.ndarray' object has no attribute 'n_colours'

转载注明原文:python – numpy的子类的数组 - 代码日志