2

Myclass 是一个numpy.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

我需要做什么来实现这种行为?还是有其他更好的方法来存储元数据?

4

2 回答 2

2

您需要覆盖该__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__中,您需要适当地对属性进行切片以及处理上述情况。

于 2013-05-02T17:34:39.320 回答
0

将您的属性附加到数组中的对象,而不是附加到数组可能会有所帮助。

于 2013-05-02T17:00:53.837 回答