h5py 提取mat文件中的HDF5格式的数据
- 使用纯Python查看数据
- 配合Matlab后,使用Python查看数据
一、使用纯Python查看文件数据内容
原理:当HDF5存储的是struct类型数据,解析时要像一棵树,我们需要逐层次的去解析,直到打印出的是一个
<HDF5 dataset "EEG": shape (1, 66), type "|O">
或者 <HDF5 dataset "8": shape (219, 57), type "<f8">
表明这是一个dataset数据结构,从而我们可以用特定形式访问到这些数据
以获取EEG key 值的数据集数据为例,不断解析获得EEG数据
重要提取信息在注释"""""中
根据自己想要的数据结构进行参考
import h5py
import numpy as np
file_path = "D:/cnt.mat" # 替换成你的文件路径
with h5py.File(file_path, "r") as hpy:
print(hpy.keys()) # 查看key值
"""
<KeysViewHDF5 ['#refs#', 'cnt']>
"""
cnt = hpy["cnt"]
print(cnt) #打印object信息
"""
<HDF5 group "/cnt" (5 members)>
"""
print(cnt.keys()) # 打印key值
"""
<KeysViewHDF5 ['EEG', 'Gender', 'HumanFactor', 'clab', 'fs']>
"""
EEG = cnt["EEG"]
print(EEG) # 打印EEG对象信息
"""
<HDF5 dataset "EEG": shape (1, 66), type "|O">
这里shape = (1, 66) 表示的是EEG对应的key的value中有1个EEG数据集,里面有66个EEG数据文件
"""
print(EEG[0]) # 打印EEG[0]信息,这一步基本上已经获取了EEG数据集相关的信息
"""
<HDF5 object reference> 需要进行最后一次提取
[<HDF5 object reference> <HDF5 object reference> <HDF5 object reference>
... ... ...
<HDF5 object reference> <HDF5 object reference> <HDF5 object reference>]
"""
print(EEG[0].shape) # 打印 EEG[0] 的shape
"""
(66,) ,表示这是一个长度为66的一维数组
"""
# 遍历66个数据集
for idx in range(len(EEG[0])):
single_dataset = hpy[EEG[0][idx]] #提取数据集
print(single_dataset)
print(np.array(single_dataset)) # 该条语句会将其数据转换成np array格式
"""
<HDF5 dataset "7": shape (281, 57), type "<f8">, single_dataset.shape = (281, 57)
这里可直接进行遍历最终的数据data
"""
# for data in single_dataset:
# print(np.array(data))
# print(data.shape)
"""
遍历获取每个维度的数据data
"""
二、使用Matlab,并迁移到Python正确解析数据
1、Matlab查看数据文件结构
使用Matlab,能将该大型文件HDF5的结构看的十分清楚,接下来我们使用Python解析该数据结构
2、Python直接打开该数据结构
import numpy as np
import h5py
file_path = "D:/cnt.mat"
with h5py.File(file_path, 'r') as file:
EEG = file["cnt"]["EEG"]
for i in range(len(EEG[0])):
dataset = file[EEG[0][i]]
print(f"dataset_{i} info : {dataset}")
print(np.array(dataset).shape, i) # 将数据矩阵转换成np array形式