MATLAB到Python的fread

时间:2013-04-01 21:36:51

标签: python matlab translation fread

我基本上要做的是将一些MATLAB代码转换为Python:

MATLAB代码:

    for time = 100:model_times
        for i = 1:5
            indat = fread(fid,[48,40],'real*4');
            vort(:,:,i,time) = indat';
        end
    end

fid保存正在使用的文件路径(DAT文件)。 vort是预分配的:vort = zeros(40,48,5,model_times)。 model_times是一个固定的整数(例如100)。

似乎正在发生的事情是.dat文件数据正在以48x40矩阵的形式读入,然后以固定的i和时间(循环计数器)插入到预分配的阵列vort中。

我在Python中试过这个:

    for time in range(model_times):
        for i in range(5):
            vort[:,:,i,time] = np.fromfile(fid,np.float64)

我收到一条错误,上面写着“ValueError:操作数无法与形状一起广播(40,48)(6048000)”。错误发生在上面的Python代码的最后一行。我也尝试将.reshape((40,48,5,model_times))添加到带有错误的行,但是收到另一个错误,上面写着“ValueError:新数组的总大小必须保持不变。”

所以我的问题是,什么是Python相当于MATLAB的“fread”,可以处理多维数组?

从1到10的等级,1是初学者,10是经验丰富的老将,我差不多是4岁。

2 个答案:

答案 0 :(得分:1)

这也应该有用。没理由你不能在一次阅读中完成所有这些:

vort = np.fromfile(fid, np.float64).reshape((model_times,5,48,40)).transpose()

你必须小心地将1-D数组重塑为文件中数组索引的本机顺序(model_times,5,48,40),然后使用转置将索引重新排序为你想要的(40, 48,5,model_times)。如果你试图直接重塑后者,你会得到错误的数据。

答案 1 :(得分:0)

我假设您在每次迭代时从二进制文件中读取48 * 40个元素,每个元素的大小为8个字节。您的代码正在破坏,因为np.fromfile默认读取每个元素。要解决这个问题,请尝试

vort = np.zeros( (48,40,5,model_times) )
for time in xrange(model_times):
  for i in xrange(5):
    dat = np.fromfile(fid, dtype=np.float64,count = 48*40)
    vort(:,:,i,time) = dat.reshape((48,40))