【问题标题】:NetCDF4 Python dimensions reorderedNetCDF4 Python 维度重新排序
【发布时间】:2015-02-02 10:20:19
【问题描述】:

我正在 python 中使用 netCDF4 创建一个 NC 文件。该文件非常简单,包含 1 维和 2 维变量(1st dim=N,2nd dim=M)。但问题是,当我读出文件时,二维变量的维度是互换的,即不是作为维度(N,M)的数据出来,而是作为维度(M,N)出来,而所有一维正如预期的那样,数据显示为 (N, )。

代码看起来像这样

root = nc.Dataset(filename, 'w', format='NETCDF4')
dimensions = ('N', 'M')

root.createDimension(dimensions[0], None)
root.createDimension(dimensions[1], None)

for field in fields:
        field_def = ...<defintion of field, how many dimensions etc...>
        if field_def[0] == 1: # how many dimensions in this variable
            chunk_size = (200, )
        else:
            chunk_size = (200, 1)

        dim = tuple(dimensions[:field_def[0]])
        var = root.createVariable(field, field_def[3], dimensions=dim,
                                fill_value=0,   chunksizes=chunk_size)

但是当我读取文件时,二维变量的维度是相反的,即块大小是 (1, chunk_size),维度是 (M, N) 而不是 (N, M)。

任何人都经历过这样的事情,或者可以看看我是否做错了什么?我已经在 Matlab 中实现了相同的功能,但结果都正确。

谢谢

【问题讨论】:

  • 如果您明确定义尺寸大小会发生什么,例如root.createDimension(dimensions[0], 200), root.createDimension(dimensions[1], 1)?
  • 为什么不在你的代码中颠倒它们的顺序呢? IE。 dimensions = ('M', 'N') 或切换createDimension 调用的顺序。 netCDF4-python 包的本机排序与许多其他包相反,例如对于 (lon, lat, z, time) 数据,它对轴 (time, z, lat, lon) 进行排序。
  • 与 netCDF 库维护人员交谈时,他们不知道有什么会导致这种行为。我首先在 netcdf4-python 中打开一个问题:github.com/unidata/netcdf4-python/issues
  • 似乎有一个MATLAB“功能”,而不是python库的问题。查看 matlab netcdf.defVar 的文档:该函数对应于 netCDF 库 C API 中的“nc_def_var”函数,但由于 MATLAB 使用 FORTRAN 样式的排序,所以变化最快的维度在前,最慢的在最后。因此,任何无限维度在维度 ID 列表中都是最后的。此顺序与 C API 中的顺序相反。

标签: python dimensions netcdf


【解决方案1】:

似乎这不是 python netCDF 问题,而是 MATLAB netCDF 的“功能”。来自 netcdf.defVar MATLAB 文档

该函数对应netCDF中的“nc_def_var”函数 库 C API,但因为 MATLAB 使用 FORTRAN 样式的排序,所以 变化最快的维度先出现,最慢的出现 最后的。因此,任何无限维度都在列表的最后 维度 ID。此排序与 C 中的相反 API。

因此,使用 MATLAB 生成的文件与其他语言不兼容,除非您对维度排序有所了解,并且可以在读写时重新排序变量。但是,如果要在使用其他库/维度排序的软件中使用文件,则必须注意这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-05
    • 1970-01-01
    • 2012-08-11
    • 2023-04-04
    • 2017-05-02
    • 1970-01-01
    • 1970-01-01
    • 2017-10-09
    相关资源
    最近更新 更多