1

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))wherexy的内容取决于每一行的插入。

如果不是,首选的方法是什么?将每个(任意形状的)多维数组存储在CArray具有唯一名称的 a 中,然后将这些名称存储在主索引表中?我想象的应用程序是存储图像和相关元数据,我希望能够查询和使用它们numexpr

非常感谢任何指向 PyTables 最佳实践的指针!

4

2 回答 2

1

长答案是“是的,但你可能不想这样做。”

PyTables 可能不直接支持它,但 HDF5 确实支持创建嵌套的可变长度数据类型,从而允许在多个维度中出现参差不齐的数组。如果您希望走这条路,您将需要使用h5py并浏览HDF5 用户指南,数据类型一章。请参见第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 数据类型用于引用,允许你存储指向数据集的指针,甚至是数据集的子集。

于 2012-01-24T20:13:01.083 回答
0

简短的回答是“不”,我认为这是 hdf5 而不是 pytables 的“限制”。

我认为原因是每个存储单元(复合数据集)必须是明确定义的大小,如果一个或多个组件可以改变大小,那么显然不会。请注意,完全可以调整和扩展 hdf5 中的数据集(pytables 大量使用它),但不能调整该数组中的数据单元。

我怀疑最好的办法是:a)使其具有明确定义的大小并提供溢出标志。如果最大的合理尺寸仍然很小,并且您可以接受抛出尾部事件,则此方法效果很好。请注意,您可能可以通过 hdf5 压缩来利用未使用的磁盘空间。b)按照您的建议在同一个文件中创建一个新的 CArray,只需在需要时读取它。(为了保持整洁,您可能希望将这些都放在他们自己的组中)

HDF5 实际上有一个 API,其设计(和优化)用于将图像存储在 hdf5 文件中。我不认为它暴露在 pytables 中。

于 2012-01-24T16:59:24.770 回答