h5py中如何访问<HDF5 object reference>元素并转为numpy数组
原因说明
你遍历得到[<HDF5 object reference>],是因为label数据集实际存储的是HDF5内部对象引用,不是直接存储的float32数值。你之前看到的type "<f4"是数据集的定义类型,实际存的是指向文件内#refs#分组下真实数据的指针,直接遍历、切片只能拿到引用本身,无法获取实际存储值。
正确读取操作
解引用必须依托处于打开状态的h5py文件对象,文件关闭后所有引用会直接失效。
- 批量转换为numpy数组实现(单值存储场景):
import numpy as np import h5py a_file_train = h5py.File(clip_dir_yang_train, "r") label_ds = a_file_train["label"] # 初始化和数据集维度匹配的numpy数组 label_arr = np.zeros(label_ds.shape, dtype=np.float32) # 逐位置解引用赋值 for row_idx in range(label_ds.shape[0]): for col_idx in range(label_ds.shape[1]): # 获取当前位置的引用 current_ref = label_ds[row_idx, col_idx] # 通过文件对象解引用,[()]直接读取为numpy原生值 label_arr[row_idx, col_idx] = a_file_train[current_ref][()]
执行完成后label_arr就是shape为(512, 1200)的标准numpy数组,可直接开展数值计算。
- 如果单个引用指向的是多元素向量/数组,只需调整初始化数组的维度即可:
比如每个引用指向长度为N的一维向量,就把初始化代码改成label_arr = np.zeros((label_ds.shape[0], label_ds.shape[1], N), dtype=np.float32),赋值时直接写入a_file_train[current_ref][()]即可。
注意:不要在完成所有解引用操作前关闭h5py文件,否则会报引用失效错误。
内容的提问来源于stack exchange,提问作者Kadaj13
相关产品推荐
相关产品推荐

