0

我基本上想做的是从一些 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:新数组的总大小必须保持不变”。

所以我的问题是,可以处理多维数组的与 MATLAB 的“fread”等价的 Python 是什么?

在从 1 到 10 的范围内,1 是初学者,10 是经验丰富的老手,我大约是 4。

4

2 回答 2

1

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

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

您必须小心地将一维数组重塑为文件中数组索引的本机顺序 (model_times,5,48,40),然后使用转置将索引重新排序为您想要的 (40,48,5 ,model_times)。如果您尝试直接重塑为后者,您将在错误的位置获取数据。

于 2013-04-01T22:40:40.240 回答
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))
于 2013-04-01T21:53:54.067 回答