好的,所以我有一个来自EEG扫描的数据文件(一个二进制文件,data.eeg),在matlab中,用于读取文件并绘制部分数据的代码如下所示:
sr=400; % Sample Rate Nyq_freq=sr/2; % Nyquist Frequency fneeg=input('Filename (with path and extension) :', 's'); t=input('How many seconds in total of EEG ? : '); ch=input('How many channels of EEG ? : '); le=t*sr; % Length of the Recording fid=fopen(fneeg, 'r', 'l'); % Open the file to read EEG=fread(fid,[ch,le],'int16'); % Read Data -> EEG Matrix fclose ('all'); plot(EEG(:,3))
这是我的“翻译”尝试
from numpy import * from matplotlib.pylab import * sample_rate = 400 Nyquist = sample_rate/2. fneeg = raw_input("Filename (full path & extension): ") t = int(raw_input("How many secs in total of EEG?: ")) ch = int(raw_input("How many channels of EEG?: ")) le = t*sample_rate fid = open(fneeg, 'r') EEG = fromfile(fneeg, int16)
这就是让我感到困惑的地方。根据文档,matlab的fread是一种通过fread(loaded_file,size,data_type)读取二进制文件的方法。python中的替代方法是使用numpy的fromfile并使用内置的reshape函数进行重塑(根据此处的线程:MATLAB to Python fread。我不确定这是如何工作的,甚至与matlab方法有关?如果我的问题令人困惑,对不起,matlab对我来说还是很新的
编辑:如果您想看一下这里的文件,则为:https : //www.dropbox.com/s/zzm6uvjfm9gpamk/data.eeg
编辑2:原始输入的答案是t = 10,ch = 32。事实上,我不确定为什么现在考虑后为什么还要输入用户信息。
正如您自己和@JoeKington在评论中所讨论的,这应该可以工作(我删除了输入内容进行测试)
import numpy as np sample_rate = 400 Nyquist = sample_rate/2.0 fneeg = 'data.eeg' t = 10 ch = 32 le = t*sample_rate EEG = np.fromfile(fneeg, 'int16').reshape(ch, le, order='F')
如果不进行重塑,您将获得:
In [45]: EEG Out[45]: array([ -39, -25, -22, ..., -168, -586, -46], dtype=int16) In [46]: EEG.shape Out[46]: (128000,)
重塑:
In [47]: EEG.reshape(ch, le, order='F') Out[47]: array([[ -39, -37, -12, ..., 5, 19, 21], [ -25, -20, 7, ..., 20, 36, 36], [ -22, -20, 0, ..., 18, 34, 36], ..., [ 104, 164, 44, ..., 60, -67, -168], [ 531, 582, 88, ..., 29, -420, -586], [ -60, -63, -92, ..., -17, -44, -46]], dtype=int16) In [48]: EEG.reshape(ch, le, order='F').shape Out[48]: (32, 4000)