我基本上要做的是将一些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岁。
答案 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))