如何在python中使用像matlab'fread'这样的函数?

时间:2017-03-27 14:18:35

标签: python matlab

这是.dat file.

在Matlab中,我可以使用此代码进行阅读。

lonlatfile='NOM_ITG_2288_2288(0E0N)_LE.dat';
f=fopen(lonlatfile,'r');
lat_fy=fread(f,[2288*2288,1],'float32');
lon_fy=fread(f,[2288*2288,1],'float32')+86.5;
lon=reshape(lon_fy,2288,2288);
lat=reshape(lat_fy,2288,2288);

以下是Matlab的一些结果: matalab

如何在python中获得相同的结果?

PS:我的代码是这样的:

def fromfileskip(fid,shape,counts,skip,dtype):
"""
fid    : file object,    Should be open binary file.
shape  : tuple of ints,  This is the desired shape of each data block.
       For a 2d array with xdim,ydim = 3000,2000 and xdim = fastest 
       dimension, then shape = (2000,3000).
counts : int, Number of times to read a data block.
skip   : int, Number of bytes to skip between reads.
dtype  : np.dtype object, Type of each binary element.
"""
    data = np.zeros((counts,)  + shape)
    for c in range(counts):
        block = np.fromfile(fid,dtype=np.float32,count=np.product(shape))
        data[c] = block.reshape(shape)
        fid.seek( fid.tell() + skip)
    return data

fid = open(r'NOM_ITG_2288_2288(0E0N)_LE.dat','rb')
data = fromfileskip(fid,(2288,2288),1,0,np.float32)
loncenter = 86.5 #Footpoint of FY2E
latcenter = 0
lon2e = data+loncenter
lat2e = data+latcenter
Lon = lon2e.reshape(2288,2288)
Lat = lat2e.reshape(2288,2288)

但是,结果与Matlab的结果不同。

1 个答案:

答案 0 :(得分:2)

您应该能够将代码直接转换为Python,几乎没有变化:

lonlatfile = 'NOM_ITG_2288_2288(0E0N)_LE.dat'
with open(lonlatfile, 'rb') as f:
    lat_fy = np.fromfile(f, count=2288*2288, dtype='float32')
    lon_fy = np.fromfile(f, count=2288*2288, dtype='float32')+86.5
lon = lon_ft.reshape([2288, 2288], order='F');
lat = lat_ft.reshape([2288, 2288], order='F');

由于索引顺序不同,正常情况下,与MATLAB结果相比,numpy reshape会被转置。 order='F'部分确保最终输出与MATLAB版本具有相同的布局。这是可选的,如果你记得不同的索引顺序,你可以将其关闭。

with open() as f:以安全的方式打开文件,确保在完成后再次关闭文件,即使程序有错误或因任何原因被取消。严格来说,它不是必需的,但在打开文件时你真的应该总是使用它。