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最佳实践的建议都将不胜感激!
发布于 2012-01-25 04:13:01
长长的答案是“可以,但您可能不想这样做。”
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数据类型,它允许您存储指向数据集的指针,甚至是指向数据集的子集的指针。
发布于 2012-01-25 00:59:25
简短的回答是“不”,我认为这是hdf5的“局限性”,而不是pytables。
我认为原因是每个存储单元(复合数据集)必须是定义良好的大小,如果一个或多个组件可以更改大小,则显然不会。注意:完全可以在hdf5中调整和扩展数据集的大小(pytables大量使用这一点),但不能调整该数组中的数据单元。
我认为最好的做法是: a)让它有一个定义良好的大小,并提供一个溢出标志。如果最大的合理大小仍然相当小,并且您可以接受抛出尾部事件,则此方法效果很好。注意:您可以使用hdf5压缩来利用未使用的磁盘空间。b)按照您的建议执行a在同一文件中创建一个新的CArray,在需要时读取该文件。(为了保持整洁,您可能希望将所有这些内容放在各自的组中)
HDF5实际上有an API,它是为在hdf5文件中存储图像而设计(和优化的)。我不认为它暴露在pytables中。
https://stackoverflow.com/questions/8921507
复制相似问题