非官方中文翻译 本页译自 MNE-Python 官方文档: 查看英文原文 ↗。 文档版权归 MNE Developers 所有(BSD-3-Clause)。

原地修改数据#

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...
General
Filename(s) sample_audvis_raw.fif
MNE object type Raw
Measurement date 2002-12-03 at 19:01:10 UTC
Participant Unknown
Experimenter MEG
Acquisition
Duration 00:00:11 (HH:MM:SS)
Sampling frequency 600.61 Hz
Time points 6,007
Channels
Magnetometers
Gradiometers and
EEG and
EOG
Stimulus
Head & sensor digitization 146 points
Filters
Highpass 0.10 Hz
Lowpass 172.18 Hz
Projections PCA-v1 (off)
PCA-v2 (off)
PCA-v3 (off)


信号处理#

大多数 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:

  • Raw plots
  • Raw plots
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 秒)

图库由 Sphinx-Gallery 生成