You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用MNE-Python加载和可视化.mat格式EEG数据遇到问题

解决MNE-Python加载.mat EEG数据的问题

一、修复read_evoked_fieldtrip()/read_epochs_fieldtrip()的TypeError错误

这两个函数必须同时传入数据和对应的Fieldtrip格式元信息(info/hdr),MNE依赖元信息记录通道配置、采样率等核心参数。Fieldtrip风格的.mat文件通常会将数据和元信息分开存储为不同变量,或放在同一文件的不同key下。

操作步骤与示例代码

import scipy.io as sio
import mne

# 加载整个.mat文件
mat_data = sio.loadmat('your_eeg_data.mat')

# 提取Fieldtrip格式的元信息和数据(变量名需根据你的文件调整,比如hdr、data)
ft_info = mat_data['hdr']
ft_data = mat_data['data']

# 加载诱发数据(若为evoked类型)
evoked = mne.read_evoked_fieldtrip(ft_data, ft_info)
# 或加载分段epochs数据
epochs = mne.read_epochs_fieldtrip(ft_data, ft_info)

如果你的.mat文件没有现成的Fieldtrip风格元信息,需要手动构建MNE的Info对象,详见下文。

二、scipy.loadmat加载后的数据处理与可视化

若.mat不是标准Fieldtrip格式,用scipy加载后需手动转换为MNE支持的Raw/Epochs/Evoked结构,再进行可视化。

1. 手动构建MNE核心元信息Info

Info是MNE处理数据的基础,必须包含通道名、采样率、通道类型:

import mne

# 替换为你的实际通道配置
ch_names = ['Fp1', 'Fp2', 'F3', 'F4', 'C3', 'C4', 'P3', 'P4', 'O1', 'O2']
ch_types = ['eeg'] * len(ch_names)  # 全EEG通道类型
sfreq = 250  # 替换为你的实际采样率(Hz)

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

2. 转换为连续数据Raw对象

如果.mat中是连续采集的EEG数据(形状为(n_channels, n_samples)):

import numpy as np
from scipy.io import loadmat

mat_data = loadmat('your_eeg_data.mat')
eeg_data = mat_data['continuous_data']  # 替换为你的数据变量名

# MNE要求数据为float64类型,且单位为伏特(若数据是微伏需除以1e6)
eeg_data = eeg_data.astype(np.float64) / 1e6

# 创建Raw对象
raw = mne.io.RawArray(eeg_data, info)

# 可视化连续数据
raw.plot(duration=10, n_channels=8)  # 显示10秒数据,一次展示8个通道
raw.plot_psd()  # 绘制功率谱密度图

3. 转换为分段数据Epochs对象

如果是事件相关的分段数据(形状为(n_epochs, n_channels, n_samples)):

mat_data = loadmat('your_eeg_data.mat')
epochs_data = mat_data['epoch_data']  # 替换为你的分段数据变量名
events = mat_data['events']  # 事件矩阵,形状为(n_epochs, 3),格式为[触发点样本索引, 0, 事件ID]

# MNE要求epochs数据形状为(n_samples, n_channels, n_epochs),需转置,同时转换单位
epochs_data = np.transpose(epochs_data, (2, 1, 0)) / 1e6

# 创建Epochs对象,tmin为分段起始时间(比如-0.2代表从事件前200ms开始)
epochs = mne.EpochsArray(epochs_data, info, events=events, tmin=-0.2)

# 可视化分段数据
epochs.plot()  # 交互式查看所有分段
epochs.average().plot()  # 绘制平均诱发响应
epochs.average().plot_topomap(times=[-0.1, 0, 0.1])  # 绘制不同时间点的脑地形图

关键注意事项

  • 数据单位:MNE默认要求数据单位为伏特(V),若.mat存储的是微伏(μV),必须除以1e6转换。
  • 通道顺序:ch_names的顺序必须与数据矩阵的通道顺序完全匹配。
  • 事件格式:Epochs所需的events矩阵必须是(n_events, 3)的整数数组,每行格式为[触发点样本索引, 0, 事件ID]。

内容的提问来源于stack exchange,提问作者esh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 14:25:31