MNE-python-系统性介绍(二)

274 阅读2分钟

Modifying data in-place

MNE Python的许多数据对象(Raw、Epochs、Evoked等)都有就地修改数据的方法(可选或强制)。这在处理大型数据集时是有利的,因为它减少了执行计算所需的计算机内存量。然而,如果不加注意地使用,它可能会导致意想不到的结果。本教程提供了一些就地处理的示例,以及如何以及何时避免这种情况。

像往常一样,我们将首先导入我们需要的模块并加载一些示例数据:

import os
import mne

sample_data_folder = mne.datasets.sample.data_path()
sample_data_raw_file = os.path.join(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.)  # raw.crop() always happens in-place
  • raw.crop()的才做就会直接覆盖原值
  • crop()大概功能就是Limit the data from the raw file to go between specific times.

Signal Processing

大多数MNE Python数据对象都有内置的过滤方法,包括高、低和带通过滤器(函数为filter())、带阻过滤器(函数为notch_filter())、希尔伯特变换(函数为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}.')

Channel Picking

另一组就地修改数据的方法是通道选取方法。例如:

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.
Removing projector <Projection | PCA-v1, active : False, n_channels : 102>
Removing projector <Projection | PCA-v2, active : False, n_channels : 102>
Removing projector <Projection | PCA-v3, active : False, n_channels : 102>
after picking, it has 60 channels.
  • 还要注意的是,当只选择EEG通道时,只影响magnetometers的projector被丢弃,因为不再有任何magnetometers通道。

非强制性覆盖,为可选参数

上面我们看到了一个使用复制方法来方便比较处理前后数据的示例。在使用某些MNE Python函数时不需要这样做,因为它们有一个函数参数,您可以在其中指定copy=True(返回数据的修改副本)或copy=False(就地操作)。例如,mne.set_eeg_reference就是这样一个函数。

rereferenced_raw, ref_data = mne.set_eeg_reference(original_raw, ['EEG 003'],
                                                   copy=True)
fig_orig = original_raw.plot()
fig_reref = rereferenced_raw.plot()
  • 请注意,这里我们在重新引用完成后绘制original_raw,但original_raw不受影响,因为我们指定了copy=True。