netCDF4:处理未使用网格点的多维数据的方法

时间:2017-05-16 10:03:31

标签: multidimensional-array netcdf netcdf4

我使用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}的数据。

我所看到的解决这个问题的方法是:

  1. 为每个Variable / height组合使用单独的一维direction
  2. 在笛卡尔积上使用单个三维Variable,即所有可能的组合,并且对于某些组合使用所有值都会被掩盖。
  3. 为每个高度使用不同的位置尺寸定义,为每个高度使用二维Variable
  4. 是否还有其他方法,有哪些原因,既有原则性又有实用性,更倾向于采用一种方法而不是另一种方法?

2 个答案:

答案 0 :(得分:1)

基本上你的答案2是正确答案。 NETCDF文件是网格化文件,因此数据描述的自然结构是定义三个维度,时间,高度和方向。对于不存在数据的数组条目,您需要将数据设置为等于元数据定义的值:

_FillValue

这意味着正在读取数据的任何软件(如R,python,ncview等)都会将这些点指定为“缺失”。

有关定义缺失值的更多详细信息,请参阅: http://www.unidata.ucar.edu/software/netcdf/docs/fill_values.html

答案 1 :(得分:0)

在阅读元数据约定时,我遇到了另一个选项:heightdirection变量的“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)]值之间的关系明确:isAvailable(url)

鉴于似乎没有图书馆支持,它不一定是所有方面最方便的选择。但是,考虑到它是以元数据标准“NetCDF Climate and Forecast (CF) Metadata Conventions”进行编码,它似乎是合理的选择。