如何使用“h5py”调整 HDF5 数组的大小

Posted

技术标签:

【中文标题】如何使用“h5py”调整 HDF5 数组的大小【英文标题】:How to resize an HDF5 array with `h5py` 【发布时间】:2014-05-24 18:17:53 【问题描述】:

如何使用h5py Python 库调整 HDF5 数组的大小?

我尝试使用.resize 方法并在chunks 设置为True 的数组上。唉,我还是错过了一些东西。

In [1]: import h5py

In [2]: f = h5py.File('foo.hdf5', 'w')

In [3]: d = f.create_dataset('data', (3, 3), dtype='i8', chunks=True)

In [4]: d.resize((6, 3))
/home/mrocklin/Software/anaconda/lib/python2.7/site-packages/h5py/_hl/dataset.pyc in resize(self, size, axis)
--> 277         self.id.set_extent(size)
ValueError: unable to set extend dataset (Dataset: Unable to initialize object)

In [11]: h5py.__version__ 
Out[11]: '2.2.1'

【问题讨论】:

也许这与数组的数据类型有关...也许尝试更标准的数据类型,例如初始化数组的文档中显示的数据类型? 刚试过没有指定dtype(我认为它默认为float)。同样的错误 您在create_dataset 上缺少maxshape 吗? @SlightlyCuban 解决了它。 maxshape 是否在磁盘上分配了那么多空间?为什么不将其设置为无限? @MRocklin 您使用的是什么版本的 h5py?我刚刚使用 2.2.1 尝试过,没有问题。 【参考方案1】:

正如 Oren 所说,如果您想稍后更改数组大小,则需要在创建 dataset 时使用 maxshape。将维度设置为 None 允许您稍后将该维度的大小调整为 2**64(h5 的限制):

In [1]: import h5py

In [2]: f = h5py.File('foo.hdf5', 'w')

In [3]: d = f.create_dataset('data', (3, 3), maxshape=(None, 3), dtype='i8', chunks=True)

In [4]: d.resize((6, 3))

In [5]: h5py.__version__
Out[5]: '2.2.1'

请参阅docs 了解更多信息。

【讨论】:

【参考方案2】:

你需要改变这一行:

d = f.create_dataset('data', (3, 3), dtype='i8', chunks=True)

d = f.create_dataset('data', (3, 3), maxshape=(?, ?), dtype='i8', chunks=True) 

d.resize((?, ?))

? 更改为您想要的任何大小(您也可以将其设置为 None

在这里阅读: http://docs.h5py.org/en/latest/high/dataset.html#resizable-datasets

【讨论】:

以上是关于如何使用“h5py”调整 HDF5 数组的大小的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 h5py 通过 szip 压缩访问 HDF5 数据集

使用不同大小的 h5py 数组保存

如何使用 Python 和 h5py 读取 HDF5 属性(元数据)

如何区分 HDF5 数据集和使用 h5py 的组?

如何使用 h5py 读取只有数据集(无组)的 HDF5 文件?

尝试通过使用 h5py 更改索引字段类型来缩小 HDF5 文件的大小