【发布时间】: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