用Python和Matlab读取浮点数二进制文件并转化为二维数组

6

我有一些二进制输入文件(扩展名为“.bin”),描述了一个二维的海洋深度场,其中所有数值都是负浮点数。我已经能够按照以下方式在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代码中,我做错了什么?

你可以使用NumPy和Matlab支持的文件格式,而不是仅仅进行自己的文件解析吗? - MSeifert
文件格式为“.bin”,不幸的是这是我所使用的模型所要求的输入文件格式。不确定是否回答了您的问题。 - henrifdrake
2个回答

7

numpy.fromfile不是跨平台的,尤其是文档中提到的“字节顺序”:

不要依赖 tofilefromfile 的组合进行数据存储,因为生成的二进制文件不是跨平台的。特别是,没有保存字节顺序或数据类型信息。

您可以尝试:

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

并且:

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

检查哪种(大端或小端)提供正确的值。


谢谢!如@Xiangrui Li所指出的,matlab函数中的'b'参数指定了大端。 - henrifdrake
啊,好的,我知道了。我以为它相当于Python中open函数中的'b'(在那里它代表“二进制”)。 :) - MSeifert
那也是我的想法! - henrifdrake

0
基于你的 Matlab fopen,该文件采用大端序('b')。但是你的 Python 代码没有考虑字节顺序。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接