将matlab代码转换为python

Posted

技术标签:

【中文标题】将matlab代码转换为python【英文标题】:Converting matlab code to python 【发布时间】:2013-11-12 19:30:57 【问题描述】:

好的,我有一个来自脑电图扫描的数据文件(二进制文件 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

Edit2:原始输入的答案是 t=10,ch=32。事实上,我不知道为什么我现在考虑到它甚至要求用户输入..

【问题讨论】:

你能发布一个输入文件的样本吗? 听起来您已经回答了自己的问题。据我所知,您只需要eeg = numpy.fromfile(filename, 'int16').reshape(ch, le)。此外,如果您愿意,可以跳过显式打开文件。 fromfile 将接受文件名和文件对象。 我在编辑中添加了指向数据的链接。 @JoeKington,这也是我的推理,但为什么我们需要重塑?我不明白其中的道理,你明白我的意思吗? @Norman, np.fromfile 只返回一个一维数组(长度为ch*le,但您希望它是一个ch X le 矩阵。reshape 只是进行了此更改,无需接触数据本身。 @NormanB,你碰巧在使用 Neuroscan 吗?我正在尝试将 Neuroscan 文件(.cnt 或 .eeg)导入 python 并遇到很多问题。 【参考方案1】:

正如你自己和@JoeKington 在 cmets 中所讨论的,这应该可以工作(我删除了用于测试的输入内容)

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)

【讨论】:

哈哈,不客气,但功劳归于你和@Joe:P NormanB - 顺便说一句,matlab 有可能(?我不记得了。)matlab 使用列优先排序而不是行优先排序...en.wikipedia.org/wiki/Row-major_order 在这种情况下,结果可能以列优先顺序写入磁盘,你会这样做fromfile(...).reshape(le, ch).T(注意lech被交换了)。无论如何,只是需要注意的事情。如果您的数据看起来有乱码,请尝试一下。 哦,是的,你是对的 (en.wikipedia.org/wiki/Row-major_order)。好收获! 这实际上是从 ipython(不是笔记本)复制和粘贴的。 ipython notebook 和标准 python 解释器之间的一个很好的折衷。 不错的收获,@Joe!更简单的解决方法是使用order='F'。我已经编辑以反映它。

以上是关于将matlab代码转换为python的主要内容,如果未能解决你的问题,请参考以下文章

文本读写与二进制读写 速度对比 Python Matlab

文本读写与二进制读写 速度对比 Python Matlab

文本读写与二进制读写 速度对比 Python Matlab

无法使用 Matlab Coder 将 Matlab 代码转换为 C 代码

如何将结构从 Matlab 代码转换为 C 代码(使用 Matlab 编译器)

将 MATLAB 代码转换为库