Как определить атом для создания Pytables EArray

Попытка создать Pytables EArray на основе одного столбца из numpy recarray. Кажется, это работает, если я использую createArray, поскольку я могу просто передать ему массив numpy, извлеченный из recarray. Однако для createEArray мне нужно определить атом, что вызывает проблемы

В примере MyRecArray — это массив записей с одномерными массивами для столбцов, Myhdf5 — предопределенный файл Pytables, а Mynode — предопределенная группа в этом файле, из которой будут висеть листья EArray.

     Myfield = MyRecArray[Colname]
     afieldtype = Myfield.dtype  
     Myatom = tables.atom.Atom(afieldtype, (1,), -9999) 
     MyEarray = Myhdf5.createEArray(Mynode, Colname, Myatom, (0,))
     MyEarray.append(Myfield )          
     MyEarray.flush()
     MyEarray.close()

использование этого кода дает ошибку:

     NotImplementedError: ``Atom`` is an abstract class; 
     please use one of its subclasses

Вероятно, я могу написать подпрограмму с операторами case на основе времени массива и передать обратно атом, но мне просто интересно, есть ли общий способ создать такой атом, передав ему тип создаваемого массива вместо того, чтобы вызывать специальная функция для разных типов данных, например "tables.atom.FloatAtom(....)"

Спасибо


person RJCL    schedule 30.10.2012    source источник


Ответы (1)


Я считаю, что с помощью функции:

tables.Atom.from_dtype(afieldtype, dflt=-9999)

позволит вам создать атом, не проходя маршрут подпрограммы. Форма содержится в dtype "afieldtype" (например, dtype([('col1', '<f8', (10,))]))

person Joel Vroom    schedule 18.09.2013