Python 可以在PyTables单元格中存储任意形状的多维数组吗?

Python 可以在PyTables单元格中存储任意形状的多维数组吗?,python,multidimensional-array,numpy,hdf5,pytables,Python,Multidimensional Array,Numpy,Hdf5,Pytables,PyTables支持从IsDescription类继承的用户定义类创建表。这包括对多维单元格的支持,如文档中的以下示例所示: class Particle(IsDescription): name = StringCol(itemsize=16) # 16-character string lati = Int32Col() # integer longi = Int32Col() # integer pressure = Float32Col(shape=(2,

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最佳实践的建议

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

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

我认为最好的办法是: a) 将其设置为定义良好的大小,并提供溢出标志。如果最大的合理大小仍然很小,并且您可以将尾部事件抛出,那么这种方法非常有效。注意:通过hdf5压缩,您可能可以利用未使用的磁盘空间。 b) 按照你的建议去做,在同一个文件中创建一个新的CArray,需要的时候就读入。(为了保持物品整洁,您可能希望将这些物品归为自己的组)

HDF5实际上有一个专门为在HDF5文件中存储图像而设计(并进行了优化)。我不认为它暴露在桌子上

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

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

我认为最好的办法是: a) 将其设置为定义良好的大小,并提供溢出标志。如果最大的合理大小仍然很小,并且您可以将尾部事件抛出,那么这种方法非常有效。注意:通过hdf5压缩,您可能可以利用未使用的磁盘空间。 b) 按照你的建议去做,在同一个文件中创建一个新的CArray,需要的时候就读入。(为了保持物品整洁,您可能希望将这些物品归为自己的组)

HDF5实际上有一个专门为在HDF5文件中存储图像而设计(并进行了优化)。我不认为它暴露在桌子上

答案很长,“是的,但你可能不想。”

PyTables可能不直接支持它,但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数据类型用于引用,允许你存储指向数据集的指针,甚至指向数据集的子集。

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

PyTables可能不直接支持它,但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数据类型用于引用,允许您存储指向数据集甚至数据集子集的指针