最简单的方法是使用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]
请记住,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)
>>> print(name)
b'/data'
>>> out = f[name]
>>> print(out.shape)
(10,)
虽然有些绕,但它似乎可行。TL;DR 是:获取所引用数据集的名称,并直接从该名称读取。
注意:
h5py.h5r.dereference
函数在这里似乎没有太大帮助,尽管名字是这样。它返回所引用对象的 ID。虽然可以直接从中读取,但在这种情况下很容易导致崩溃(我在这个人为例子中做了好几次)。获取名称并从那里读取会更容易。
注意2:
正如h5py 2.1 的发布说明中所述,使用 Dataset.value
属性已被弃用,应替换为使用适当的 mydataset[...]
或 mydataset[()]
。
Dataset.value
属性最初于 h5py 1.0 中推出,现已弃用,并将在以后的版本中删除。此属性将整个数据集转储为 NumPy 数组。使用 .value
的代码应更新为使用 NumPy 索引,使用适当的 mydataset[...]
或 mydataset[()]
。