gpt4 book ai didi

python - 将HDF5文件读入numpy数组

转载 作者:行者123 更新时间:2023-12-04 04:58:46 24 4
gpt4 key购买 nike

我有以下代码将hdf5文件读取为numpy数组:

hf = h5py.File('path/to/file', 'r')
n1 = hf.get('dataset_name')
n2 = np.array(n1)


当我打印 n2时,我得到了:

Out[15]:
array([[<HDF5 object reference>, <HDF5 object reference>,
<HDF5 object reference>, <HDF5 object reference>...


如何读取 HDF5 object reference以查看其中存储的数据?

最佳答案

最简单的方法是使用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)


然后,您可以通过getting回获取名称来读取其中一个,然后从引用的实际数据集中进行读取。

>>> 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。可以直接从中读取,但是在这种情况下很容易导致崩溃(我在这个人为的示例中做了几次)。获取名称并从中读取要容易得多。

关于python - 将HDF5文件读入numpy数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46733052/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com