2017-06-02 154 views
1

我有一些二進制輸入文件(擴展名爲「.bin」),描述了海洋深度的二維場,並且都是負浮點數。我已經能夠加載它們在matlab如下:在python和matlab中讀取浮點二進制文件到二維數組中

f = fopen(filename,'r','b'); 
data = reshape(fread(f,'float32'),[128 64]); 

這個matlab代碼給了我0和-5200之間的雙值。但是,當我嘗試在Python中使用相同的函數時,我奇怪地獲得0和1e-37之間的值。 Python的代碼是:

f = open(filename, 'rb') 
data = np.fromfile(f, np.float32) 
data.shape = (64,128) 

奇怪的是,有0土地屏蔽值這兩種情況下(64,128)陣列在正確的地方顯示出來。這似乎只是numpy.float32值的大小和符號。

我在Python代碼中做了什麼錯誤?

+0

而不是隻做你自己的文件解析,你不能使用NumPy和Matlab支持的文件格式嗎? – MSeifert

+0

文件格式爲「.bin」,不幸的是,這是我使用的模型輸入文件所需的格式。不知道這是否回答你的問題。 – henrifdrake

回答

0

numpy.fromfile不是獨立的平臺,特別是「字節順序」的文件中提及:

不要依靠tofilefromfile用於數據存儲的組合,生成的二進制文件不是平臺獨立的。特別是,不保存字節順序或數據類型信息。

你可以嘗試:

data = np.fromfile(f, '>f4') # big-endian float32 

和:

data = np.fromfile(f, '<f4') # little-endian float32 

,並檢查其中之一(大端或小端)給出了正確的價值觀。

+0

謝謝!正如@Xiangrui Li所指出的那樣,matlab函數中的'b'參數指定了big-endian。 – henrifdrake

+0

啊,很高興知道。我認爲它相當於'open'中的''b'(它代表「binary」)。 :) – MSeifert

+0

這是我的想法! – henrifdrake

0

基於你的matlab fopen,該文件是在大端('b')。但是你的python代碼並不關心字節順序。

相關問題