我尝试使用 Python 从二进制文件中读取带有 float 的二维数组。文件已由 Fortran 程序以大端字节序写入(它是天气研究和预报模型的中间文件)。我已经知道要读取的数组的维度大小(nx 和 ny),但作为 Fortran 和 IDl 程序员,我完全迷失了,如何在 Python 中管理它。 (稍后我想可视化该数组)。
- 我应该使用
struct.unpack
或numpy.fromfile
或array 模块
吗? - 我是否必须先读取向量,然后再对其进行整形? (仅在 numpy-way 中见过此选项)
- 如何使用 numpy 定义二维数组以及如何定义以大端字节顺序读取的数据类型?
- 是否需要考虑数组排序(按列或行)的问题?
最佳答案
每个子问题的简短答案:
- 我认为
array
模块没有办法指定字节顺序。 在struct
模块和 Numpy 之间我认为 Numpy 更容易 使用,特别是对于类似 Fortran 的有序数组。 - 就硬件(磁盘、 RAM 等)受到关注,所以是的 reshape 以获得 2D 表示 总是有必要的。使用 numpy.fromfile 必须进行 reshape 之后显式地进行,但是 numpy.memmap 提供了一种 reshape 的方法 更加含蓄。
- 使用 Numpy 指定字节顺序的最简单方法是使用短字符
type string ,实际上与 approach needed for
the
struct
module 非常相似。在 Numpy>f
和>f4
中指定单个 精度和>d
和>f8
double 大端浮点 点。 - 您的二进制文件可以沿着行(类似 C)或沿着
列(类似 Fortran)。无论两者中的哪一个,都必须考虑到这一点
帐户以正确表示数据。 Numpy 使这变得简单
reshape
和memmap
(以及其他)的order
关键字参数。
总而言之,代码可以是这样的:
import numpy as np
filename = 'somethingsomething'
with open(filename, 'rb') as f:
nx, ny = ... # parse; advance file-pointer to data segment
data = np.fromfile(f, dtype='>f8', count=nx*ny)
array = np.reshape(data, [nx, ny], order='F')
关于Python-从二进制数据读取二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32693337/