NetCDF4 Python维度已重新排序

NetCDF4 Python维度已重新排序,python,dimensions,netcdf,Python,Dimensions,Netcdf,我正在使用python中的netCDF4创建一个NC文件。该文件非常简单,包含1维和2维的变量(第1维=N,第2维=M)。但问题是,当我读取该文件时,2D变量的维度是互换的,即,它们不是作为维度(N,M)的数据显示,而是作为维度(M,N)显示,而所有1D数据作为(N,)显示,正如预期的那样 代码看起来像这样 root = nc.Dataset(filename, 'w', format='NETCDF4') dimensions = ('N', 'M') root.createDimensio

我正在使用python中的netCDF4创建一个NC文件。该文件非常简单,包含1维和2维的变量(第1维=N,第2维=M)。但问题是,当我读取该文件时,2D变量的维度是互换的,即,它们不是作为维度(N,M)的数据显示,而是作为维度(M,N)显示,而所有1D数据作为(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)
root=nc.Dataset(文件名'w',格式='NETCDF4')
维度=('N','M')
root.createDimension(维度[0],无)
root.createDimension(维度[1],无)
对于字段中的字段:
字段_def=。。。
如果字段_def[0]==1:#此变量中有多少个维度
块大小=(200,)
其他:
块大小=(200,1)
dim=元组(维度[:字段定义[0]])
var=root.createVariable(字段,字段定义[3],维度=dim,
填充值=0,块大小=块大小)
但当我读取文件时,2D变量的维度是相反的,即块大小是(1,chunk_size),维度是(M,N)而不是(N,M)

有谁经历过这样的事情,或者能看出我做错了什么?我在Matlab中实现了同样的功能,但结果都是正确的


谢谢

这似乎不是python netCDF的问题,而是MATLAB netCDF的一个“特性”。来自netcdf.defVar MATLAB文档

此函数对应于netCDF中的“nc_def_var”函数 库C API,但由于MATLAB使用FORTRAN样式的排序 变化最快的维度首先出现,变化最慢的维度出现 最后的因此,任何无限制维度都是列表中的最后一个维度 维度ID。这种顺序与C语言中的顺序相反 API


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

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