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

15 篇文章 52 订阅

上一篇文章中介绍了研究读取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

评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值