设计理念#
交互式分析与脚本化分析#
MNE-Python 提供了许多出色的交互式绘图功能,可帮助你探索数据,也有一些类似 GUI 的交互式绘图命令(例如浏览原始数据并点击标记坏通道,或通过点击拖拽标注不良时间段)。但总体而言,无法仅靠鼠标点击就用 MNE-Python 完成一项可发表的分析。MNE-Python 最适合将分析流程整理成一个或多个 Python 脚本。好处在于,脚本记录了你分析中所做的每一件事,便于日后调整分析和/或与他人(包括未来的自己)分享。
与科学 Python 生态的集成#
MNE-Python 也能与其他标准科学 Python 库良好集成。例如,MNE-Python 对象在底层将数据存储为 NumPy 数组,因此很容易应用自定义算法,或将数据传入 scikit-learn 的某个机器学习流水线。MNE-Python 的二维绘图函数还会返回 matplotlib 的 Figure 对象,三维绘图函数则返回 mne.viz.Figure3D 类,其 .plotter 属性指向 pyvista.Plotter 实例,因此你可以使用 matplotlib 或 PyVista 的任意绘图命令来自定义 MNE-Python 的图。其目标是:MNE-Python 能让大多数神经科学家完成其期望分析目标的 90%,而其他软件包则可以帮助他们冲过终点线。
基于子模块的组织方式#
一个值得了解的组织原则是,MNE-Python 的对象和函数按子模块划分。如果你使用的编辑器支持 Tab 补全,这有助于你发现相关函数。例如,输入 mne.preprocessing. mne.viz)、数据读写函数(mne.io)、统计函数(mne.stats)等也是如此。这还能减少按键次数——不用写:
import mne
mne.preprocessing.eog.peak_finder(...)
mne.preprocessing.eog.find_eog_events(...)
mne.preprocessing.eog.create_eog_epochs(...)
你可以直接导入子模块,只用子模块名就能访问其函数:
from mne.preprocessing import eog
eog.peak_finder(...)
eog.find_eog_events(...)
eog.create_eog_epochs(...)
(大体上)统一的 API#
我们尽可能为不同的数据类提供统一的 API。例如,Raw、Epochs、Evoked 和 SourceEstimate 类都有 plot() 方法,通常无需指定任何参数即可调用,并仍能得到信息丰富的数据图。同样,它们都有 copy()、crop()、resample() 和 save() 方法,方法签名相似或完全相同。传感器级类还都有 info 属性,其中包含一个 Info 对象,用于跟踪通道名称和类型、已应用的滤波器、投影器等。更多信息参见 Info 数据结构。
原地操作#
由于神经影像数据集可能相当大,MNE-Python 会尽力避免在后台对数据做不必要的复制。为进一步提高内存效率,许多对象方法都原地操作(并静默返回其对象以支持方法链式调用)。原地操作可能让你在交互式探索分析中频繁使用 copy() 方法——这样你可以尝试不同的预处理方法或参数设置,而无需每次都重新加载数据——但在将完成的脚本应用于数十名被试的数据时,它也能大幅节省内存。