Python 中 MNE 读取EEG竞赛数据绘图和提取epoch(gdf格式)

本文分享了一段曲折的经历,作者在处理GDF格式的EEG数据时,遭遇了绘图异常的问题。经过多次尝试和探索,最终通过自定义RawArray数据结构成功绘制出了正确的图像。文章详细记录了问题的发现、调试过程及解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上一篇文章中介绍了研究读取gdf格式数据的心路历程,绕了半天竟然直接操作就可以。本来以为会很容易,毕竟数据都已经成功读入了,可是我又错了,弄了好久读取的数据绘图都不对(打印看数据是对的),感觉是mne的一个bug,在Github上提issue可是网络不给力,图片死活传不上,最后给开发团队发了封邮件,也不知道能不能回我。。。。好在经过不懈努力,试了多种方法,总算有一种方法可以成功绘制数据图像了。

问题描述,读取数据绘图,可以明显看出EEG数据绘制的图像有问题。

rawDataGDF = mne.io.read_raw_gdf("B0101T.gdf",preload=True,eog=['EOG:ch01', 'EOG:ch02', 'EOG:ch03'])

rawDataGDF.plot()

打印输出数据查看,并没有发现异常。

又尝试了N多的方法,也没有定位到问题的根本原因,虽然严重怀疑是描述信息(info)有问题,可是比对了好久也没有发现异常。最后没办法了尝试自己构造RawArray数据结构,虽然麻烦一些,也是最后的办法了,好在这个方法可行。

sfreq = 250 

data = np.squeeze(np.array([rawDataGDF['EEG:Cz'][0], rawDataGDF['EEG:C3'][0], rawDataGDF['EEG:C4'][0]]))

ch_types = ['eeg', 'eeg', 'eeg']

ch_names = ['EEG:Cz', 'EEG:C3', 'EEG:C4',]

info = mne.create_info(ch_names=ch_names,sfreq=sfreq,ch_types=ch_types)

raw = mne.io.RawArray(data, info)

raw.plot(n_channels=3,show=True)

最后将代码整理了下,用于处理EEG竞赛的数据,嗯嗯,真香~~

import mne
import matplotlib.pyplot as plt
import numpy as np
%matplotlib auto
#文件路径和文件名称
path = "F:\\BaiduNetdiskDownload\\BCICompetition\\BCICIV_2b_gdf\\"
fileName = "B0101T"
#事件的对应关系
eventDescription = {'276': "eyesOpen", '277': "eyesClosed", '768': "startTrail", '769':"cueLeft", '770':"cueRight", '781':"feedback", '783':"cueUnknown",
            '1023': "rejected", '1077': 'horizonEyeMove', '1078': "verticalEyeMove", '1079':"eyeRotation",'1081':"eyeBlinks",'32766':"startRun"}
# 读取原始数据
rawDataGDF = mne.io.read_raw_gdf(path+fileName+".gdf",preload=True,eog=['EOG:ch01', 'EOG:ch02', 'EOG:ch03'])
# 定义数据通道和通道类型
ch_types = ['eeg', 'eeg', 'eeg','eog','eog','eog']
ch_names = ['EEG:Cz', 'EEG:C3', 'EEG:C4','EOG:ch01', 'EOG:ch02', 'EOG:ch03']
# 创建数据的描述信息
info = mne.create_info(ch_names=ch_names, sfreq=rawDataGDF.info['sfreq'], ch_types=ch_types)
# 创建数据结构体
data = np.squeeze(np.array([rawDataGDF['EEG:Cz'][0], rawDataGDF['EEG:C3'][0], rawDataGDF['EEG:C4'][0], rawDataGDF['EOG:ch01'][0] , rawDataGDF['EOG:ch02'][0] ,rawDataGDF['EOG:ch03'][0]]))
# 创建RawArray类型的数据
rawData = mne.io.RawArray(data, info)
rawData.plot()
# 获取事件
event,_= mne.events_from_annotations(rawDataGDF)
print(event)
event_id = {}
for i in _:#整理event_id
    event_id[eventDescription[i]] = _[i]
# 提取epoch
epochs = mne.Epochs(rawData,event,event_id, tmax=1.5 ,event_repeated = 'merge')
epochs.plot()
ev_left = epochs['cueLeft']
ev_left.plot()

原始数据图像 

epochs数据图像

左手对应得epoch

### 使用 MNE Python 读取并处理文件夹内的 EEG GDF 数据 要使用 MNE读取处理存储在文件夹中的 EEG GDF 文件,可以通过以下方式实现: #### 1. 安装必要的依赖项 确保已安装 `mne` 其相关依赖项。如果尚未安装,可执行以下命令: ```bash pip install mne ``` #### 2. 导入所需模块 导入用于操作文件路径以及加载 EEG 数据的必要模块。 ```python import os import glob import mne ``` #### 3. 遍历文件夹中的 GDF 文件 通过 `glob` 模块查找指定目录下的所有 `.gdf` 文件。 ```python folder_path = 'path/to/your/folder' # 替换为实际文件夹路径 gdf_files = glob.glob(os.path.join(folder_path, '*.gdf')) if not gdf_files: raise FileNotFoundError("No .gdf files found in the specified folder.") ``` #### 4. 加载单个 GDF 文件 对于每个找到的 GDF 文件,可以使用 `mne.io.read_raw_gdf()` 函数来加载数据[^1]。 ```python for file_path in gdf_files: try: raw = mne.io.read_raw_gdf(file_path, preload=True) print(f"Loaded {file_path}") # 显示基本信息 print(raw.info) # 可视化部分数据 raw.plot(n_channels=10, duration=5, show_scrollbars=False, show_scalebars=False) except Exception as e: print(f"Failed to load {file_path}: {str(e)}") ``` #### 5. 处理事件标注 (Annotations) 某些情况下,GDF 文件可能包含时间标记或事件信息。这些信息可通过 `mne.events_from_annotations()` 提取。 ```python events, event_id = mne.events_from_annotations(raw) print(events[:5]) print(event_id) ``` #### 6. 创建 Epochs 对象 基于提取到的时间标记创建 Epochs 对象以便进一步分析。 ```python tmin, tmax = -0.2, 0.8 # 时间窗口设置 picks = mne.pick_types(raw.info, eeg=True, exclude='bads') epochs = mne.Epochs(raw, events, event_id=event_id, tmin=tmin, tmax=tmax, proj=True, picks=picks, baseline=(None, 0), preload=True) print(epochs) ``` #### 7. 进行 ICA 去噪 为了去除伪影(如眼动信号),可以应用独立成分分析 (ICA)[^2]。 ```python ica = mne.preprocessing.ICA(n_components=15, random_state=97, max_iter=800) ica.fit(raw) ica.exclude = [1, 2] # 手动排除特定分量 raw_clean = ica.apply(raw.copy()) ``` #### 8. 存储清理后的数据 将去噪后的数据保存至新的文件中以供后续使用。 ```python output_file = os.path.splitext(file_path)[0] + '_cleaned.fif' mne.export.export_raw(output_file, raw_clean, fmt='fiff', overwrite=True) print(f"Cleaned data saved to {output_file}.") ``` --- ### 注意事项 - 如果遇到无法解析的 GDF 文件,请确认该文件是否符合标准格式或者尝试先用 MATLAB 转换成其他兼容格式后再重新加载。 - 当前代码假设所有的 EEG 渠道名称均遵循一致的标准;如有特殊命名规则,则需调整 `pick_types` 参数。 ---
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值