无法在Python中读取.mat文件:HDF5对象引用处理难题
解决Matlab HDF5文件中对象引用的读取问题
我太懂你这种卡了好几天的感觉了——用scipy.loadmat读不了文件,换h5py又拿到一堆<HDF5 object reference>,完全摸不着头脑对吧?其实这是Matlab存储复杂数据结构的常规操作,这些引用本质上是指向文件里实际存储矩阵数据的"指针",咱们只需要顺着引用找到对应的数据集就行。
试试这段代码,帮你把引用转成想要的m×4矩阵:
import h5py import numpy as np # 打开文件 f = h5py.File('./imgIdx.mat','r') # 取出anno里的所有对象引用 anno_refs = f['imgIdx/anno'][:] # 拿第1000个引用举例,解析出实际矩阵 target_ref = anno_refs[1000] # 通过引用访问对应的数据集,转成numpy数组 actual_matrix = np.array(f[target_ref]) print(actual_matrix)
这里还有两个需要注意的小细节:
- Matlab存储数组的维度顺序和numpy可能相反,如果输出的矩阵形状不对,直接加个
.T转置就行:actual_matrix.T - 如果
anno里的每个元素都是指向一个m×4矩阵的引用,你可以批量处理所有数据:all_matrices = [] for ref in anno_refs: mat = np.array(f[ref]) # 根据实际情况调整维度 processed_mat = mat.T if mat.shape != (m,4) else mat all_matrices.append(processed_mat)
另外补充一句,你判断文件是HDF5格式完全正确——Matlab 7.3及以上版本默认用HDF5存储复杂结构,这时候scipy.io.loadmat确实搞不定,h5py是正确的工具,只是需要多一步解析引用的操作而已。
内容的提问来源于stack exchange,提问作者mahmoud fathy
相关产品推荐
相关产品推荐

