MNE Python写入BIDS数据遇ValueError:数据已加载,求解决
解决MNE-BIDS写入BIDS数据时的ValueError问题
在学习《M/EEG analysis with MNE Python》教程的"01:35:57 Working with BIDS data"片段时,运行以下代码:
import matplotlib.pyplot as plt import pathlib import matplotlib import mne import mne_bids matplotlib.use('Qt5Agg') directory ='C:/Users/User/mne_data/MNE-sample-data/MEG\sample/sample_audvis_raw.fif' raw =mne.io.read_raw(directory) #raw.plot() #plt.show() events =mne.find_events(raw) #print(events) event_id ={ "Auditory/Left":1, "Auditory/Right":2, "Visual/Left":3, "Visual/Right":4, "Smiley":5, "Button":32 } raw.info['line_freq']=60 raw.load_data() out_path =pathlib.Path("out_data/sample_bids") bids_path =mne_bids.BIDSPath(subject='01',session='01',task='audiovisual',run='01',root=out_path) mne_bids.write_raw_bids(raw,bids_path=bids_path,events_data=events,event_id=event_id,overwrite=True)
触发错误:
ValueError: The data is already loaded from disk and may be altered. See warning for "allow_preload".
错误原因
mne_bids.write_raw_bids默认会检查原始数据是否已加载到内存,因为加载后的数据可能被修改,无法保证写入BIDS格式的是未改动的原始数据,因此会抛出这个错误。代码中raw.load_data()将整个数据集加载到了内存,触发了该检查机制。
解决方案
有两种可行的解决方式:
方式一:移除不必要的raw.load_data()调用
mne.find_events()不需要提前加载完整数据,MNE会自动按需从磁盘读取所需部分,因此可以直接删除raw.load_data()这一行,修改后的代码如下:
import matplotlib.pyplot as plt import pathlib import matplotlib import mne import mne_bids matplotlib.use('Qt5Agg') directory ='C:/Users/User/mne_data/MNE-sample-data/MEG\sample/sample_audvis_raw.fif' raw =mne.io.read_raw(directory) #raw.plot() #plt.show() events =mne.find_events(raw) #print(events) event_id ={ "Auditory/Left":1, "Auditory/Right":2, "Visual/Left":3, "Visual/Right":4, "Smiley":5, "Button":32 } raw.info['line_freq']=60 # 移除raw.load_data() out_path =pathlib.Path("out_data/sample_bids") bids_path =mne_bids.BIDSPath(subject='01',session='01',task='audiovisual',run='01',root=out_path) mne_bids.write_raw_bids(raw,bids_path=bids_path,events_data=events,event_id=event_id,overwrite=True)
方式二:添加allow_preload=True参数(适用于必须提前加载数据的场景)
如果因为预处理需求必须提前加载数据到内存,可在write_raw_bids调用中加入allow_preload=True,明确允许处理已加载的数据:
# 其他代码保持不变 mne_bids.write_raw_bids(raw,bids_path=bids_path,events_data=events,event_id=event_id,overwrite=True, allow_preload=True)
内容的提问来源于stack exchange,提问作者Machine_Learning
相关产品推荐
相关产品推荐

