python - 将HDF5文件读入numpy数组

标签 python numpy hdf5 h5py

我有以下代码将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/

相关文章:

python - 名称错误 : global name 'self' is not defined -Classes

python - 访问 Numpy 矩阵的下三角?

Python pandas 使用 read_hdf 和 HDFStore.select 从 HDF5 文件读取特定值

javascript - 像在 Python 中那样比较 Javascript 中的两个列表的最佳方法是什么?

python - 来自 Theano 表达式的梯度,用于 Keras 中的过滤器可视化

python - Open3d Python 问题 : No attribute 'estimate_normals'

python - 在感知器学习模型的 Python 实现中将数组传递给 numpy.dot()

java - 如何使用 NetBeans 在 Windows Java 项目中使用 HDF5

python - 我可以在 Cython 中静态键入 h5file 数组吗?

python - 多处理搜索,无需在内存中重复索引