Выравнивание dtype таблицы Pytables

Если я создам следующий выровненный массив Numpy

import numpy as np
import tables as pt
numrows = 10
dt = np.dtype([('date', [('year', '<i4'), ('month', '<i4'), ('day', '<i4')]), 
               ('apples', '<f8'), 
               ('oranges', '|S7'),
               ('pears', '<i4')], align=True) 
x = np.zeros(numrows, dtype=dt)
for d in x.dtype.descr:
    print d

и распечатайте dtype.descr, я получаю следующее:

('date', [('year', '<i4'), ('month', '<i4'), ('day', '<i4')])
('', '|V4')
('apples', '<f8')
('oranges', '|S7')
('', '|V1')
('pears', '<i4')

Тип dtype включает в себя эти дополнительные пробелы '|V4', '|V1'

Теперь, когда я создаю таблицу Pytable-> с использованием того же dtype (разновидность Numpy), кажется, что я теряю выравнивание.

h5file = pt.open_file('mytable.h5', mode='w')
table = h5file.create_table('/', 'mytable', dt, filters=None, expectedrows=numrows, byteorder='little')
policy = table.row

for j in xrange(numrows):
    for field in table.colnames:
        if (field == 'date'):
            policy[field] = (2014, 1, 8)
        else:
            policy[field] = 0
    policy.append() 

table.flush()
mytable = h5file.root.mytable[:]
h5file.close()
for d in mytable.dtype.descr:
    print d

Результат которого:

('date', [('year', '<i4'), ('month', '<i4'), ('day', '<i4')])
('apples', '<f8')
('oranges', '|S7')
('pears', '<i4')

Больше никаких пробелов '|V'

Как я могу построить таблицу Pytable- > так, чтобы выравнивание сохранялось (сохранялись пробелы «|V»)?


person Joel Vroom    schedule 08.01.2014    source источник


Ответы (1)


PyTables по умолчанию не поддерживает тип данных numpy void для столбцов — см. источник для tables.descr_from_dtype(). Однако вы, вероятно, можете заставить PyTables работать, заменив пустоты на uint8. Это будет выглядеть примерно так:

dt = ...
expanded_dt = np.dtype(dt.descr)
newdt = []
for name, col in zip(expanded_dt.names, expanded_dt):
    if np.issubdtype(col, np.void):
        newdt.append([name, np.uint8(col.itemsize)])
    else:
        newdt.append([name, col])


newdt = np.dtype(newdt)

Это поместит поддельные столбцы, которые имеют правильную ширину.

person Anthony Scopatz    schedule 09.01.2014