如果我创建以下对齐 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'
现在,当我使用相同的dtype(Numpy风格)创建Pytable-&gt;表时,似乎我失去了对齐。
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-&gt;表格以保持对齐(保留'| V'空格)?
答案 0 :(得分:1)
默认情况下,PyTables不支持列的numpy void数据类型 - 请参阅tables.descr_from_dtype()
的源代码。但是,您可以通过用uint8s替换空洞来欺骗PyTables。这看起来像是:
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)
这将放入具有正确宽度的假列。