最简单的方法是使用 HDF5 数据集的.value 属性。
>>> hf = h5py.File('/path/to/file', 'r')
>>> data = hf.get('dataset_name').value # `data` is now an ndarray.
您还可以对数据集进行切片,这会生成一个包含请求数据的实际 ndarray:
>>> hf['dataset_name'][:10] # produces ndarray as well
但请记住,h5py 数据集在许多方面的行为类似于ndarray。因此,您可以将数据集本身原封不动地传递给大多数(如果不是全部)NumPy 函数。因此,例如,这很好用:np.mean(hf.get('dataset_name'))。
编辑:
我最初误解了这个问题。问题不在于加载数字数据,而是数据集实际上包含 HDF5 引用。这是一个奇怪的设置,在h5py 中阅读有点尴尬。您需要取消引用数据集中的每个引用。我将只为其中一个展示它。
首先,让我们创建一个文件和一个临时数据集:
>>> f = h5py.File('tmp.h5', 'w')
>>> ds = f.create_dataset('data', data=np.zeros(10,))
接下来,创建对它的引用并将其中一些存储在数据集中。
>>> ref_dtype = h5py.special_dtype(ref=h5py.Reference)
>>> ref_ds = f.create_dataset('data_refs', data=(ds.ref, ds.ref), dtype=ref_dtype)
然后,您可以通过获取其名称,然后从引用的实际数据集中读取其中一个,以一种迂回的方式读取。
>>> name = h5py.h5r.get_name(ref_ds[0], f.id) # 2nd argument is the file identifier
>>> print(name)
b'/data'
>>> out = f[name]
>>> print(out.shape)
(10,)
这是迂回的,但它似乎工作。 TL;DR 是:获取引用数据集的名称,并直接从中读取。
注意:
h5py.h5r.dereference 函数在这里似乎没什么用,尽管有这个名字。它返回被引用对象的 ID。这可以直接读取,但在这种情况下很容易导致崩溃(我在这个人为的例子中做了几次)。获取名称并从中读取要容易得多。
注2:
如release notes for h5py 2.1 中所述,不推荐使用Dataset.value 属性,应酌情使用mydataset[...] 或mydataset[()] 替换。
可追溯到 h5py 1.0 的属性 Dataset.value 已被弃用,并将在以后的版本中删除。此属性将整个数据集转储到 NumPy 数组中。使用.value 的代码应更新为使用NumPy 索引,并酌情使用mydataset[...] 或mydataset[()]。