将Matlab转换为Python以读取二进制文件。

3

我正在尝试将Matlab脚本转换为Python。该脚本读取一个二进制文件并将其重新整形成多列。

Matlab脚本如下:

fid=fopen(binary_file,'rb');
[inpar,ic]=fread(fid,4,'int');
if (ic<4) ; idata=[];return;end
nmagic=inpar(1);
nh=inpar(2);
nrpar=inpar(3);
nipar=inpar(4);


[rdata,ic]=fread(binary_file,[nh,nrpar],'float');
if (ic<nh*nrpar) ; return;end
[idata,ic]=fread(fid,[nh,nipar],'int');
if (ic<nh*nipar) ; return;end

我尝试的Python代码是:

import numpy as np 

inpar = np.fromfile(fid, dtype=np.int32)
nmagic, nh, nrpar, nipar = inpar

rdata = np.fromfile(fid, dtype=np.float32, count=nh * nrpar).reshape(nh, nrpar)
idata = np.fromfile(fid, dtype=np.int32, count=nh * nipar).reshape(nh, nipar)

我不确定Matlab是如何重塑数据的。有没有人可以帮我将代码翻译成Python以达到相同的结果。这里提供了一个样本数据here


请提供一个可重现的例子(预期输入和输出) - Salvatore Daniele Bianco
1个回答

4

让我们尝试使用rb模式中的open读取数据,以便以二进制模式读取。然后,我们将使用np.fromfile从文件中读取。

import numpy as np

with open(binary_file, 'rb') as fid:
    inpar = np.fromfile(fid, dtype=np.int32, count=4)
    if inpar.size < 4:
        idata = []
    else:
        nmagic, nh, nrpar, nipar = inpar

        rdata = np.fromfile(fid, dtype=np.float32, count=nh * nrpar)
        if rdata.size < nh * nrpar:
            # handle error
            pass
        else:
            rdata = rdata.reshape(nh, nrpar)

        idata = np.fromfile(fid, dtype=np.int32, count=nh * nipar)
        if idata.size < nh * nipar:
            # handle error
            pass
        else:
            idata = idata.reshape(nh, nipar)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接