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。