netCDF4:使用未使用的网格点处理多维数据的方法
netCDF4: Approaches to dealing with multidimensional data with unused grid points
我正在使用 netCDF4 存储多维数据。例如,数据具有三个维度,time = [0, 1, 2]
、height = [10, 20]
、direction = [0, 120, 180, 240, 300]
,但并非所有组合(网格点)都有数据。在我们的示例中,将其限制为 height
/direction
组合。也就是说,假设在 height == 10
我们只有 direction in {0, 120, 240}
的数据,在 height == 20
只有 direction in {120, 180, 300}
.
的数据
我看到的处理这个问题的方法是:
- 为每个
height
/direction
组合使用单独的一维 Variable
。
- 在笛卡尔积上使用单个三维
Variable
,即所有可能的组合,并接受这样一个事实,即对于某些组合,所有值都被屏蔽了。
- 为每个高度使用不同的位置尺寸定义,并为每个高度使用二维
Variable
。
是否有其他方法以及原则上和实践上优先选择一种方法的原因是什么?
基本上你的答案2是正确的。 NETCDF 文件是网格文件,因此数据描述的自然结构是定义三个维度,时间、高度和方向。对于不存在数据的数组条目,您需要将数据设置为等于元数据定义的值:
_FillValue
这意味着任何正在读取数据的软件,如R、python、ncview等,都会将这些点分配为"missing"。
有关定义缺失值的更多详细信息,请参阅:
http://www.unidata.ucar.edu/software/netcdf/docs/fill_values.html
在阅读元数据约定时,我遇到了另一个选项:height
和 direction
变量的“compression by gathering”到单个 location variable
.
这在玩具示例中如何工作?首先将所有位置收集到一个一维列表中:
0: 10,0 *
1: 10,120 *
2: 10,180
3: 10,240 *
4: 10,300
5: 20,0
6: 20,120 *
7: 20,180 *
8: 20,240
9: 20,300 *
然后 location = [0, 1, 3, 6, 7, 9]
和数据仅使用两个维度定义,location
具有 compress: "height direction"
属性,以及 time
。可能最好添加一个二维辅助坐标变量,使位置索引和 height/direction
值之间的关系明确:height_direction = [(10,0), (10,120), (10,240), (20,120), (20,180), (0,300)]
.
鉴于似乎没有库对此提供支持,它不一定在所有方面都是最方便的选择。然而,考虑到它是在元数据标准“NetCDF Climate and Forecast (CF) Metadata Conventions”中编码的,这似乎是一个值得考虑的合法选择。
我正在使用 netCDF4 存储多维数据。例如,数据具有三个维度,time = [0, 1, 2]
、height = [10, 20]
、direction = [0, 120, 180, 240, 300]
,但并非所有组合(网格点)都有数据。在我们的示例中,将其限制为 height
/direction
组合。也就是说,假设在 height == 10
我们只有 direction in {0, 120, 240}
的数据,在 height == 20
只有 direction in {120, 180, 300}
.
我看到的处理这个问题的方法是:
- 为每个
height
/direction
组合使用单独的一维Variable
。 - 在笛卡尔积上使用单个三维
Variable
,即所有可能的组合,并接受这样一个事实,即对于某些组合,所有值都被屏蔽了。 - 为每个高度使用不同的位置尺寸定义,并为每个高度使用二维
Variable
。
是否有其他方法以及原则上和实践上优先选择一种方法的原因是什么?
基本上你的答案2是正确的。 NETCDF 文件是网格文件,因此数据描述的自然结构是定义三个维度,时间、高度和方向。对于不存在数据的数组条目,您需要将数据设置为等于元数据定义的值:
_FillValue
这意味着任何正在读取数据的软件,如R、python、ncview等,都会将这些点分配为"missing"。
有关定义缺失值的更多详细信息,请参阅: http://www.unidata.ucar.edu/software/netcdf/docs/fill_values.html
在阅读元数据约定时,我遇到了另一个选项:height
和 direction
变量的“compression by gathering”到单个 location variable
.
这在玩具示例中如何工作?首先将所有位置收集到一个一维列表中:
0: 10,0 *
1: 10,120 *
2: 10,180
3: 10,240 *
4: 10,300
5: 20,0
6: 20,120 *
7: 20,180 *
8: 20,240
9: 20,300 *
然后 location = [0, 1, 3, 6, 7, 9]
和数据仅使用两个维度定义,location
具有 compress: "height direction"
属性,以及 time
。可能最好添加一个二维辅助坐标变量,使位置索引和 height/direction
值之间的关系明确:height_direction = [(10,0), (10,120), (10,240), (20,120), (20,180), (0,300)]
.
鉴于似乎没有库对此提供支持,它不一定在所有方面都是最方便的选择。然而,考虑到它是在元数据标准“NetCDF Climate and Forecast (CF) Metadata Conventions”中编码的,这似乎是一个值得考虑的合法选择。