Python - 从二进制数据中读取2d数组

时间:2015-09-21 10:49:18

标签: python arrays numpy binary endianness

我尝试使用Python从二进制文件中读取带有浮点数的二维数组。文件是用Fortran程序用big endian编写的(它是Weather Research and Forecast模型的中间文件)。我已经知道要读取的数组的维度大小(nx& ny)但作为Fortran和IDl程序员我完全迷失了,如何在Python中管理它。 (后来我想要可视化数组)。

  1. 我应该使用struct.unpacknumpy.fromfile还是array module
  2. 我必须首先阅读一个矢量,然后重塑它吗? (已经看到这个选项只适用于numpy-way)
  3. 如何使用numpy定义2d数组?如何使用big-endian字节顺序定义要读取的dtype?
  4. 是否存在数组排序(列或行方式)的问题?

1 个答案:

答案 0 :(得分:1)

每个子问题的简短答案:

  1. 我认为array模块没有办法指定字节顺序。 在struct模块和Numpy之间,我认为Numpy更容易 使用,特别是对于类似Fortran的有序数组。
  2. 就硬件而言,所有数据本质上都是一维的(磁盘, RAM等等,所以是重塑以获得2D表示 永远是必要的。使用numpy.fromfile重塑必须发生 明确地说,但是numpy.memmap提供了一种重塑的方法 更含蓄地。
  3. 使用Numpy指定字节顺序的最简单方法是使用short type string,实际上与approach needed for the struct module非常相似。在Numpy中>f>f4指定单个 精度和>d>f8双精度大端浮动 点。
  4. 您的二进制文件可以沿着行(C样)或沿着行走数组 列(Fortran-like)。无论哪一个,都必须考虑到这一点 帐户正确表示数据。 Numpy让这很简单 orderreshape(以及其他)的memmap关键字参数。
  5. 总而言之,代码可以是例如:

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