Myclass
- это подкласс numpy.ndarray
, предназначенный для представления набора изображений, которые меняются со временем. Для каждого изображения есть набор метаданных, таких как время, температура окружающей среды и температура камеры. Я сохранил эти метаданные в списке словарей, поэтому каждый словарь соответствует слою в массиве (myclass.metadata[0]
- это словарь, соответствующий изображению в myclass[0]
).Обрезка атрибутов подкласса Numpy
Я также перегрузил 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
Что мне нужно сделать, чтобы реализовать такое поведение? Или есть другой лучший способ хранения метаданных?
Также может потребоваться изучить PyTables, хороший способ хранения данных и связанных метаданных. Супер быстрый также! – reptilicus
Я уже использую h5py для хранения данных на диске – karlson