python - Numpy 子类属性切片

标签 python numpy slice

Myclassnumpy.ndarray 子类,旨在表示一组随时间变化的图像。每张图像都有一组元数据,例如时间、环境温度和相机温度。我已将这些元数据存储在字典列表中,以便每个字典对应于数组中的一个层(myclass.metadata[0] 是与 myclass 中的图像对应的字典[0])。

我还重载了 getattr() 以使字典中的项目可以通过其键访问,以便 myclass.etemp 产生例如[24.9、25.0、25.1]

当我对 Myclass 对象进行切片时,如何实现我的属性数组以相同的方式进行切片?

现在,如果我执行 myobject[1].etemp,我会得到 [24.9, 25.0, 25.1],但我想要 [25.0].

这是我的课:

class Stack(numpy.ndarray):
    props= [
            'version',
            'width',
            'height',
            'shotrange',
            'calibrange',
            'unit',
            'irb_fname',
            'fidx',
            'distance',
            'etemp',
            'zoom',
            'ctemp',
            'date',
            'recdate',
            'rectime',
            ]

    def __new__(cls, input_array, mdata=None):
        obj = numpy.asarray(input_array).view(cls)
        if isinstance(mdata, collections.Iterable): # when reading from text file
            obj.mdata = mdata
        else:
            obj.mdata = [arr.mdata[0] for arr in input_array] # when combining Stack-type objects
        return obj

    def __array_finalize__(self, obj):
        if obj is None: return
        self.mdata = getattr(obj, 'mdata', None)

    def __getattr__(self, name):
        print(numpy.shape(self))
        if numpy.rank(self) < 3: # we're looking at a single slice
            pass
        if name == 'starttime':
            return self.mdata[0]['date']
        elif name == 'time':
            return [(item['date'] - self.mdata[0]['date']).total_seconds() for item in self.mdata]
        elif name in Stack.props:
            return [item[name] for item in self.mdata]
        else:
            raise AttributeError

我需要做什么才能实现该行为?或者还有其他更好的方式来存储元数据?

最佳答案

您需要重写__getitem__方法。

class Foo(object):
    def __getitem__(self,items):
        print items

f = Foo()
f[1,2,3]
f[1:3]
f[1,1:3,2:3]

这将返回:

1
(1, 2, 3)
slice(1, 3, None)
(1, slice(1, 3, None), slice(2, 3, None))

__getitem__ 中,您需要适本地对属性进行切片并处理上述情况。

关于python - Numpy 子类属性切片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16343034/

相关文章:

python - 将字符串作为输入,像计算器一样对其进行计算并返回整数答案的函数

Python Pandas 条件无法准确识别行

python - 如何嵌套 numpy() 的 np.where,或者一个接一个?

Python 将切片作为参数传递

java - 使用 Java springdata 保存带有上限数组($slice 和 $sort)的 mongoDB 文档

python - 根据纬度和经度过滤数据 - Numpy

python - pip:卸载已安装的 disutils 软件包

python - 从 1D reshape 为 2D numpy 数组后如何返回元素的位置(索引)?

python - 如何组合多个numpy掩码

用于检索假负值的 Python 编程