MNE-Python 第1天学习笔记:环境搭建与数据初探

发布时间:2026/5/23 6:53:59

MNE-Python 第1天学习笔记:环境搭建与数据初探 一、什么是 MNE-PythonMNE全称是Magnetoencephalography and Electroencephalography Neuroimaging Engineering是专门用于分析脑电图EEG和脑磁图MEG数据的 Python 工具包。简单来说它能帮我们 读取各种格式的脑电数据 清理数据中的噪声和伪迹 分析和提取有意义的脑电特征 绘制漂亮的脑电图表二、环境搭建pip install mne -i https://pypi.tuna.tsinghua.edu.cn/simple三、下载练习数据集MNE 官方提供了免费的示例数据集大约 2GB包含真实实验数据import mne import matplotlib.pyplot as plt # 下载样本数据集只需下载一次之后直接调用 sample_data_folder mne.datasets.sample.data_path() print(f数据集存放位置: {sample_data_folder})数据集里有什么 听觉刺激反应被试听声音时的脑电️ 视觉刺激反应被试看图像时的脑电 运动想象数据被试想象运动时的脑电四、认识 Raw 对象 - 脑电数据的身份证4.1 什么是 Raw 对象RAW对象存储的是原始的连续脑电数据可以理解为一张大表格行每个通道电极的数据列每个时间点的采样值4.2 加载原始数据import os # 构建数据文件路径 raw_fname os.path.join(sample_data_folder, MEG, sample, sample_audvis_raw.fif) # 加载数据 raw mne.io.read_raw_fif(raw_fname, preloadFalse) print(✅ 数据加载成功)4.3 查看数据基本信息这是认识数据的第一步就像拿到一本书先看封面和目录# 1. 查看完整信息 print(raw.info)# 2. 提取关键参数 print(f采样率{raw.info[sfreq]} Hz) print(f通道数{len(raw.ch_names)}) print(f数据时长{raw.times[-1]:.0f} 秒约{raw.times[-1]/60:.1f}分钟)raw.times的下标是“第几个点”值是这个点对应的时刻。4.4 理解通道类型脑电数据中有不同类型的通道各自作用不同# 查看通道类型统计 from collections import Counter ch_types raw.get_channel_types() type_counts Counter(ch_types) print(通道类型统计) for ch_type, count in type_counts.items(): print(f {ch_type}: {count} 个)五、数据的基本操作CRUD5.1 复制数据# 养成好习惯操作前先复制保留原始数据 raw_copy raw.copy()5.2 裁剪数据选择时间段# 只看第 60 秒到 120 秒的数据 raw_cropped raw.copy().crop(tmin60, tmax120) print(f裁剪后时长{raw_cropped.times[-1] - raw_cropped.times[0]:.0f} 秒)为什么要裁剪1原始数据太长分析时只关注特定时间段2去掉开头和结尾的质量不好的部分5.3 选择通道# 方法1选择前 10 个通道 raw_subset raw.copy().pick([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) # 方法2选择特定类型的通道 raw_eeg raw.copy().pick_types(eegTrue) # 只要 EEG 通道5.4 查看数据矩阵# 获取所有数据通道数 × 时间点数 data, times raw[:, :] print(f数据矩阵形状{data.shape}) print(f → {data.shape[0]} 个通道 × {data.shape[1]} 个时间点)六、数据可视化 - 让数据说话6.1 时间序列图最重要查看脑电波随时间的变化# 显示前 60 秒10 个通道 raw.plot(duration60, n_channels10, scalingsauto, blockTrue)6.2 查看特定时间段start_time 100 duration 30 # 先裁剪再绘制 raw_segment raw.copy().crop(tminstart_time, tmaxstart_time duration) raw_segment.plot(n_channels20, durationduration, scalingsauto, blockTrue, titlef第{start_time}秒到{start_timeduration}秒)6.3 功率谱密度图PSD显示不同频率的能量分布raw.plot_psd(fmin0.5, fmax50, spatial_colorsTrue) plt.title(功率谱密度 - 各频率的能量分布) plt.show(blockTrue)6.4 通道位置图查看电极在头皮上的排列# 2D 平面图 raw.plot_sensors(show_namesTrue, title电极位置10-20系统, blockTrue) # 3D 立体图需要安装 pyvista # pip install pyvista -i https://pypi.tuna.tsinghua.edu.cn/simple七、完整代码示例这是今天的完整学习代码可以直接复制运行# 必须放在最开头 import matplotlib matplotlib.use(TkAgg) # import matplotlib.pyplot as plt import mne import numpy as np import os from collections import Counter print(*60) print( MNE-Python 第1天环境搭建与数据初探) print(*60) # ---------- 1. 下载和加载数据 ---------- print(\n步骤1下载示例数据集...) sample_data_folder mne.datasets.sample.data_path() raw_fname os.path.join(sample_data_folder, MEG, sample, sample_audvis_raw.fif) print(步骤2加载数据...) raw mne.io.read_raw_fif(raw_fname, preloadFalse) print(✅ 数据加载成功) # ---------- 2. 查看数据基本信息 ---------- print(\n *60) print( 数据基本信息) print(*60) print(f采样率: {raw.info[sfreq]} Hz) print(f通道总数: {len(raw.ch_names)}) print(f数据时长: {raw.times[-1]:.0f} 秒 ({raw.times[-1]/60:.1f} 分钟)) print(f采样点数: {len(raw.times)}) print(\n前 10 个通道名称:) for i, name in enumerate(raw.ch_names[:10]): #enumerate()为每个通道名添加索引编号从0开始 print(f {i}: {name}) # ---------- 3. 通道类型统计 ---------- print(\n通道类型统计:) ch_types raw.get_channel_types() type_counts Counter(ch_types) for ch_type, count in type_counts.items(): print(f {ch_type}: {count} 个) # ---------- 4. 数据操作 ---------- print(\n *60) print( 数据基本操作) print(*60) # 裁剪数据 raw_cropped raw.copy().crop(tmin60, tmax120) print(f裁剪后时长: {raw_cropped.times[-1] - raw_cropped.times[0]:.0f} 秒) # 选择通道 raw_subset raw.copy().pick([0, 1, 2, 3, 4]) print(f选择的通道: {raw_subset.ch_names}) # ---------- 5. 数据可视化 ---------- print(\n *60) print( 数据可视化) print(*60) # 5.1 时间序列图 print(\n1️⃣ 显示时间序列图...) raw.plot(duration10, n_channels10, scalingsauto, blockTrue, title原始脑电数据 - 前10个通道) # 5.2 功率谱密度图 print(\n2️⃣ 显示功率谱密度图...) raw.plot_psd(fmin0.5, fmax50, spatial_colorsTrue) plt.title(功率谱密度 (PSD) - 各频率能量分布) plt.show(blockTrue) # 5.3 通道位置图 print(\n3️⃣ 显示通道位置图...) raw.plot_sensors(show_namesTrue, title电极位置分布图, blockTrue) print(\n *60) print(✅ 第1天学习完成) print(*60)

相关新闻