我试图读取一个二进制文件,该文件由几个由单个int分隔的浮点数矩阵组成。 Matlab中实现此目的的代码如下:
fid1=fopen(fname1,'r');
for i=1:xx
Rstart= fread(fid1,1,'int32'); #read blank at the begining
ZZ1 = fread(fid1,[Nx Ny],'real*4'); #read z
Rend = fread(fid1,1,'int32'); #read blank at the end
end
如您所见,每个矩阵大小为Nx乘Ny。 Rstart和Rend只是虚拟值。 ZZ1是我感兴趣的矩阵。
我正在尝试在python中执行相同操作,执行以下操作:
Rstart = np.fromfile(fname1,dtype='int32',count=1)
ZZ1 = np.fromfile(fname1,dtype='float32',count=Ny1*Nx1).reshape(Ny1,Nx1)
Rend = np.fromfile(fname1,dtype='int32',count=1)
然后,我必须迭代读取后续矩阵,但函数 np.fromfile 不会将指针保留在文件中。
另一种选择:
with open(fname1,'r') as f:
ZZ1=np.memmap(f, dtype='float32', mode='r', offset = 4,shape=(Ny1,Nx1))
plt.pcolor(ZZ1)
这适用于第一个数组,但不会读取下一个矩阵。不知道怎么办?
我搜索了类似的问题,但没有找到合适的答案。
由于
答案 0 :(得分:2)
在单个矢量化语句中读取所有矩阵的最简洁方法是使用结构数组:
dtype = [('start', np.int32), ('ZZ', np.float32, (Ny1, Nx1)), ('end', np.int32)]
with open(fname1, 'rb') as fh:
data = np.fromfile(fh, dtype)
print(data['ZZ'])
答案 1 :(得分:1)
此问题有2种解决方案。
第一个:
for i in range(x):
ZZ1=np.memmap(fname1, dtype='float32', mode='r', offset = 4+8*i+(Nx1*Ny1)*4*i,shape=(Ny1,Nx1))
i 是您想要获得的数组。
第二个:
fid=open('fname','rb')
for i in range(x):
Rstart = np.fromfile(fid,dtype='int32',count=1)
ZZ1 = np.fromfile(fid,dtype='float32',count=Ny1*Nx1).reshape(Ny1,Nx1)
Rend = np.fromfile(fid,dtype='int32',count=1)
正如morningsun指出的那样,np.fromfile可以接收一个文件对象作为参数并跟踪指针。请注意,您必须以二进制模式'rb'打开文件。