PyTables支持从继承自IsDescription类的用户定义类创建表。这包括对多维单元格的支持,如以下文档中的示例所示:
class Particle(IsDescription):
name = StringCol(itemsize=16) # 16-character string
lati = Int32Col() # integer
longi = Int32Col() # integer
pressure = Float32Col(shape=(2,3)) # array of floats (single-precision)
temperature = Float64Col(shape=(2,3)) # array of doubles (double-precision)
但是,是否可以在单个单元格中存储任意形状的多维数组?按照上面的示例,pressure = Float32Col(shape=(x, y))
之类的内容x
和y
在插入每一行时确定。
如果没有,首选方法是什么?将每个(任意形状的)多维数组存储在具有唯一名称的CArray
中,然后将这些名称存储在主索引表中?我想象的应用程序是存储图像和相关元数据,我希望能够查询和使用numexpr
。
非常感谢任何有关PyTables最佳实践的指示!
答案 0 :(得分:1)
答案很长,“是的,但你可能不想这样做。”
PyTables可能不直接支持它,但HDF5支持创建嵌套的可变长度数据类型,允许多维度的不规则数组。如果您希望沿着这条路走下去,您将需要使用h5py并浏览HDF5 User's Guide, Datatypes chapter。见 6.4.3.2.3部分。可变长度数据类型。 (我把它联系起来,但他们显然选择不把锚钉放在那里)。
就个人而言,我将你所获得的数据排列成数据集组,而不是单个表。就是这样:
/particles/particlename1/pressure
/particles/particlename1/temperature
/particles/particlename2/pressure
/particles/particlename2/temperature
等等。 lat和long值将是/particles/particlename
组的属性而不是数据集,尽管它们的小数据集也非常好。
如果您希望能够根据lat和long进行搜索,那么拥有lat / long / name列的数据集就会很好。如果你想得到真正的想象,那么有一个用于引用的HDF5数据类型,允许你存储指向数据集的指针,甚至存储到数据集的子集。
答案 1 :(得分:0)
简短的回答是“不”,我认为它是hdf5的“限制”而不是pytables。
我认为原因是每个存储单元(复合数据集)必须是一个定义良好的大小,如果一个或多个组件可以改变大小,那么它显然不会。请注意,完全可以调整和扩展hdf5中的数据集(pytables大量使用它),但不是该数组中的数据单位。
我怀疑最好的办法是: a)使其定义明确,并提供溢出标志。如果最大的合理大小仍然很小并且你可以抛出尾部事件,那么这种方法很有效。请注意,您可以使用hdf5压缩来获取未使用的磁盘空间。 b)按照您的建议,在同一个文件中创建一个新的CArray,只需在需要时读取。 (为了保持整洁,你可能想把这些都放在他们自己的小组之下)
HDF5实际上具有an API,其被设计(并优化)用于在hdf5文件中存储图像。我不认为它暴露在pytables中。