专栏首页脑机接口Python-EEG工具库MNE中文教程(1)-MNE中数据结构Raw及其用法简介
原创

Python-EEG工具库MNE中文教程(1)-MNE中数据结构Raw及其用法简介

Raw数据结构

Raw对象主要用来存储连续型数据,核心数据为n_channels和times,也包含Info对象。

下面可以通过几个案例来说明Raw对象和相关用法。

Raw结构查看:

# 引入python库
import mne
from mne.datasets import sample
import matplotlib.pyplot as plt

# sample的存放地址
data_path = sample.data_path()
# 该fif文件存放地址
fname = data_path + '/MEG/sample/sample_audvis_raw.fif'

"""
如果上述给定的地址中存在该文件,则直接加载本地文件,
如果不存在则在网上下载改数据
"""
raw = mne.io.read_raw_fif(fname)
图1

通过打印raw:

print(raw)

<Raw | sample_audvis_raw.fif, n_channels x n_times : 376 x 166800 (277.7 sec), ~3.6 MB, data not loaded>

可以看出核心数据为n_channels和n_times

raw.info

上面为row中info的信息,从中可以看出info记录了raw中有哪些是不良通道(bads),通道名称:ch_names,sfreq:采样频率等。

通常raw的数据访问方式如下:

data, times = rawpicks, time_slice

picks:是根据条件挑选出来的索引;

time_slice:时间切片

想要获取raw中所有数据,以下两种方式均可:

data,times=raw:

data,times=raw:,:

"""
案例:
获取10-20秒内的良好的MEG数据

# 根据type来选择 那些良好的MEG信号(良好的MEG信号,通过设置exclude="bads") channel,
结果为 channels所对应的的索引
"""

picks = mne.pick_types(raw.info, meg=True, exclude='bads')
t_idx = raw.time_as_index([10., 20.])
data, times = raw[picks, t_idx[0]:t_idx[1]]
plt.plot(times,data.T)
plt.title("Sample channels")
图2
"""
sfreq:采样频率

raw返回所选信道以及时间段内的数据和时间点,
分别赋值给data以及times(即raw对象返回的是两个array)
"""
sfreq=raw.info['sfreq']
data,times=raw[:5,int(sfreq*1):int(sfreq*3)]
plt.plot(times,data.T)
plt.title("Sample channels")
图3
"""
绘制各通道的功率谱密度
"""
raw.plot_psd()
plt.show()
图4
"""
绘制SSP矢量图
"""
raw.plot_projs_topomap()
plt.show()
图5
"""
绘制通道频谱图作为topography
"""
raw.plot_psd_topo()
plt.show()
图6
"""
绘制电极位置
"""
raw.plot_sensors()
plt.show()
图7

MNE 从头创建Raw对象

在实际过程中,有时需要从头构建数据来创建Raw对象。

方式:通过mne.io.RawArray类来手动创建Raw

注:使用mne.io.RawArray创建Raw对象时,其构造函数只接受矩阵和info对象。

数据对应的单位:

V: eeg, eog, seeg, emg, ecg, bio, ecog

T: mag

T/m: grad

M: hbo, hbr

Am: dipole

AU: misc

构建一个Raw对象时,需要准备两种数据,一种是data数据,一种是Info数据,

data数据是一个二维数据,形状为(n_channels,n_times)

案例1

import mne
import numpy as np
import matplotlib.pyplot as plt

"""
生成一个大小为5x1000的二维随机数据
其中5代表5个通道,1000代表times
"""
data = np.random.randn(5, 1000)

"""
创建info结构,
内容包括:通道名称和通道类型
设置采样频率为:sfreq=100
"""
info = mne.create_info(
    ch_names=['MEG1', 'MEG2', 'EEG1', 'EEG2', 'EOG'],
    ch_types=['grad', 'grad', 'eeg', 'eeg', 'eog'],
    sfreq=100
)
"""
利用mne.io.RawArray类创建Raw对象
"""
custom_raw = mne.io.RawArray(data, info)
print(custom_raw)
图8

从上面打印的信息可以看出

raw对象中n_channels=5, n_times=1000

"""
对图形进行缩放

对于实际的EEG / MEG数据,应使用不同的比例因子。
对通道eeg、grad,eog的数据进行2倍缩小
"""
scalings = {'eeg': 2, 'grad': 2,'eog':2}
custom_raw.plot(n_channels=5, 
                scalings=scalings,
                title='Data from arrays',
         show=True, block=True)

plt.show()
图9

案例2

import numpy as np
import neo

import mne
import matplotlib.pyplot as plt

构建正余弦数据模拟mag,grad信号

其中采样频率为1000Hz,时间为0到10s.

# 创建任意数据
sfreq = 1000  # 采样频率
times = np.arange(0, 10, 0.001)  # Use 10000 samples (10s)

sin = np.sin(times * 10)  # 乘以 10 缩短周期
cos = np.cos(times * 10)
sinX2 = sin * 2
cosX2 = cos * 2

# 数组大小为 4 X 10000.
data = np.array([sin, cos, sinX2, cosX2])

# 定义 channel types and names.
ch_types = ['mag', 'mag', 'grad', 'grad']
ch_names = ['sin', 'cos', 'sinX2', 'cosX2']

创建info对象

"""
创建info对象
"""
info = mne.create_info(ch_names=ch_names,
                       sfreq=sfreq, 
                       ch_types=ch_types)

利用mne.io.RawArray创建raw对象

"""
利用mne.io.RawArray创建raw对象
"""
raw = mne.io.RawArray(data, info)

"""
对图形进行缩放

对于实际的EEG / MEG数据,应使用不同的比例因子。

对通道mag的数据进行2倍缩小,对grad的数据进行1.7倍缩小
"""
scalings = {'mag': 2, 'grad':1.7}

raw.plot(n_channels=4, scalings=scalings, title='Data from arrays',
         show=True, block=True)

"""
可以采用自动缩放比例

只要设置scalings='auto'即可
"""
scalings = 'auto'
raw.plot(n_channels=4, scalings=scalings,
         title='Auto-scaled Data from arrays',
         show=True, block=True)
plt.show()
图10
图11

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • MNE中文教程(1)-MNE中数据结构Raw及其用法简介

    Raw对象主要用来存储连续型数据,核心数据为n_channels和times,也包含Info对象。

    脑机接口社区
  • MNE-Python专辑 (2) MNE中数据结构Raw及其用法简介(更新)

    Raw对象主要用来存储连续型数据,核心数据为n_channels和times,也包含Info对象。

    脑机接口社区
  • Python-生成模拟原始脑电数据

    在实验中有时需要原始脑电数据来进行模拟实验,但又限于实验条件的不足,需要构造模拟的原始脑电数据。

    脑机接口社区
  • Python多线程与Socket编程综合案例:素数

    2)服务器端程序使用一个线程不停地搜索和判断素数,另一个线程接收网络查询并返回是否素数的结果。

    Python小屋屋主
  • Python json.dumps 中文

        需要对外提供一个接口,输出的内容里有中文。结果打开一看,返回的是这么一串东西。

    py3study
  • SQLMAP配合PHP中转忽略ssl

    主要是我最近,沉迷挖洞(edusrc),然后就顺便的学习到了很多之前没接触过的一些东西,比如各类未授权访问啊,或者是各类信息泄露,最惨的还是当属 Rj45了,自...

    Elapse
  • python中关于中文报错的解决办法

    对于像我这样刚接触python的人来说,很可能在代码中输入中文就会出现报错情况,比如说我写这样一个小代码:

    py3study
  • web端引入微信(vue项目)

    用户4344670
  • Python|蚂蚁感冒

    长100厘米的细长直杆子上有n只蚂蚁。它们的头有的朝左,有的朝右。每只蚂蚁都只能沿着杆子向前爬,速度是1厘米/秒。当两只蚂蚁碰面时,它们会同时掉头往相反的方向爬...

    算法与编程之美
  • 机器学习各种熵:从入门到全面掌握

    作者: 黄海安 编辑: 陈人和 概述 信息熵是信息论和机器学习中非常重要的概念,应用及其广泛,各种熵之间都存在某些直接或...

    机器学习算法工程师

扫码关注云+社区

领取腾讯云代金券