簡體   English   中英

使用numpy讀取二進制文件中的幾個數組

[英]Reading several arrays in a binary file with numpy

我正在嘗試讀取一個二進制文件,該文件由幾個由單個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 x 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)

這對於第一個數組工作正常,但不會讀取下一個矩陣。 知道我該怎么做嗎?

我搜索了類似的問題,但沒有找到合適的答案。

謝謝

在單個矢量化語句中讀取所有矩陣的最干凈方法是使用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'])

有兩種解決方案。

第一個:

for i in range(x):
    ZZ1=np.memmap(fname1, dtype='float32', mode='r', offset = 4+8*i+(Nx1*Ny1)*4*i,shape=(Ny1,Nx1))

在哪里是你想得到的數組。

第二個:

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”打開文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM