用numpy读取二进制文件中的几个数组

2024-09-24 02:25:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图读取一个二进制文件,该文件由几个浮点数矩阵组成,用单个整数隔开。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中执行相同的操作,执行以下操作:

^{pr2}$

然后,我要迭代读取后面的矩阵,但是函数np.fromfile文件不在文件中保留指针。在

另一个选择:

with open(fname1,'r') as f:
   ZZ1=np.memmap(f, dtype='float32', mode='r', offset = 4,shape=(Ny1,Nx1))
   plt.pcolor(ZZ1)

这对第一个数组很好,但不读取下一个矩阵。你知道我怎么做吗?在

我找过类似的问题,但没有找到合适的答案。在

谢谢


Tags: 文件theread矩阵atnxblankny
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是要获取的数组。在

第二个:

^{pr2}$

所以正如晨曦指出的,np.fromfile文件可以接收文件对象作为参数并跟踪指针。请注意,您必须以二进制模式“rb”打开该文件。在

在一个向量化语句中读取所有矩阵的最简单方法是使用struct数组:

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'])

相关问题 更多 >