说明
转到末尾下载完整示例代码。
原地修改数据#
MNE-Python 的许多数据对象(Raw、Epochs、Evoked 等)都带有原地修改数据的方法(有些是可选的,有些则是强制性的)。这在大数据集上工作时很有优势,因为它能减少执行计算所需的计算机内存。不过,如果你没有意识到这一点,也可能导致意外结果。本教程给出了几个原地处理的示例,并说明如何以及何时避免它。
和往常一样,我们先导入所需的模块并加载一些示例数据:
# Authors: The MNE-Python contributors.
# License: BSD-3-Clause
# Copyright the MNE-Python contributors.
import mne
sample_data_folder = mne.datasets.sample.data_path()
sample_data_raw_file = sample_data_folder / "MEG" / "sample" / "sample_audvis_raw.fif"
# the preload flag loads the data into memory now
raw = mne.io.read_raw_fif(sample_data_raw_file, preload=True)
raw.crop(tmax=10.0) # raw.crop() always happens in-place
Opening raw data file /home/circleci/mne_data/MNE-sample-data/MEG/sample/sample_audvis_raw.fif...
Read a total of 3 projection items:
PCA-v1 (1 x 102) idle
PCA-v2 (1 x 102) idle
PCA-v3 (1 x 102) idle
Range : 25800 ... 192599 = 42.956 ... 320.670 secs
Ready.
Reading 0 ... 166799 = 0.000 ... 277.714 secs...
信号处理#
大多数 MNE-Python 数据对象都内置了滤波方法,包括高通、低通和带通滤波(filter)、带阻滤波(notch_filter)、Hilbert 变换(apply_hilbert),甚至任意或用户自定义函数(apply_function)。这些方法通常总是原地修改数据,因此如果我们想保留未处理的数据以便比较,就必须先复制一份。例如:
original_raw = raw.copy()
raw.apply_hilbert()
print(
f"original data type was {original_raw.get_data().dtype}, after "
f"apply_hilbert the data type changed to {raw.get_data().dtype}."
)
original data type was float64, after apply_hilbert the data type changed to complex128.
通道选择#
另一类会原地修改数据的方法是通道选择方法。例如:
print(f"original data had {original_raw.info['nchan']} channels.")
original_raw.pick("eeg") # selects only the EEG channels
print(f"after picking, it has {original_raw.info['nchan']} channels.")
original data had 376 channels.
after picking, it has 60 channels.
另请注意,当仅选择 EEG 通道时,只影响磁力计的投影器会被丢弃,因为此时已不再有磁力计通道。
copy 参数#
上面我们看到了使用 copy 方法来方便比较处理前后数据的示例。在使用某些 MNE-Python 函数时并不需要这样做,因为它们有一个函数参数,可以指定 copy=True(返回修改后的数据副本)或 copy=False(原地操作)。例如,mne.set_eeg_reference 就是这样一个函数;注意这里我们在重参考完成后绘制 original_raw,但 original_raw 并未受影响,因为我们指定了 copy=True:
rereferenced_raw, ref_data = mne.set_eeg_reference(original_raw, "EEG 003", copy=True)
fig_orig = original_raw.plot()
fig_reref = rereferenced_raw.plot()
EEG channel type selected for re-referencing
Applying a custom ('EEG',) reference.
Using qt as 2D backend.
另一个例子是选择函数 mne.pick_info,它操作的是 mne.Info 字典而不是数据对象。详情参见 Info 数据结构。
Summary#
一般来说,应当预期数据对象的方法会原地操作,而以数据对象作为参数的函数会操作数据的副本(除非该函数有 copy 参数且默认为 False,或者你指定了 copy=False)。在分析的探索阶段,你可能想尝试不同数据清洗方法的效果;如果希望避免每次更改计算时都要重新加载数据并重复前面的步骤,就应习惯 raw.copy().filter(...).plot() 或 raw.copy().apply_proj().compute_psd().plot() 这样的写法(关于方法链的更多信息,参见原地操作一节)。
脚本总运行时间:(0 分钟 2.256 秒)

