1

我希望能够在 python 中对规则间隔的 2D 经纬度数据执行区域加权重新网格化,例如从 0.5x0.5 网格到 2.5x3.75 网格。该数据是以 kg/m^2/s 为单位的排放量,因此我需要保存质量和空间分布。

我知道有许多 scipy 插值例程,我不确定在这种情况下哪个(如果有的话)是最好的。如果可能,我宁愿不必安装太多额外的 python 包,除非绝对需要(即我安装了 scipy+numpy,但宁愿不必安装专业的 python 包,它会做我需要的,也需要我将数据存储在特定的类结构等中。但是,如果需要,我会这样做!)。

这也是一个学习练习,让我了解如何在 python 中做这些事情,以及能够做到这一点。

4

1 回答 1

3

这是一个相当复杂的问题,答案相当复杂,而且有很多机会出错。正如您在评论中所说,您有这样的经度、纬度向量:

'0.5x0.5'
np.arange(-89.75,90.25,0.5)      #[-89.75,-89.25,...,89.25,89.75],  latitudes 
np.arange(0.25,360.25,0.5)       #[0.25,0.75,...,359.25,359.75],    longitudes

或这个:

'1x1'
np.arange(-90.0,91.0,1.0)         #[-90.0,-89.0,...,89.0,90.0],     latitudes 
np.arange(-180.0,180.0,1.0)       #[-180.0,-179.0,...178.0,179.0],  longitudes

并且您需要将关联的数据集转换为这种格式:

'73x96 (or N48)'
np.arange(-90.0,92.5,2.5)         #[-90.0,-87.5,...,87.5,90.0]      latitudes 
np.arange(0.0,360.00,3.75)        #[0.0,3.75,...,352.5,356.25]      longitudes

或这个:

'1.25x1.875 (or N96)'
np.array(-90.0,91.25,1.25)        #[-90.0,-88.75,...,90.00]         latitudes 
np.array(0.0,360.00,1.875)        #[0.0,1.875,...,358.125]          longitudes

所有条目均用于网格单元中心。

部分好消息是您不需要进行任何插值。我们可以upsample(纵向和横向)只需重复输入,即如果我们有一个1*1间隔数据集,我们可以通过重复每一列和每一行将其更改为0.5*0.5间隔数据集,这对您的数据有效,即使我们使用球形网格数据!考虑将一个初始细胞分成更小的细胞 - 每个新细胞的密度与原始细胞中的密度相同。我们可以这样做:

data_up = np.repeat(data, 2, axis=0)
data_up = np.repeat(data_up, 2, axis=1)

这是一个很好的方法,因为我们不做任何假设,也不会丢失任何数据。我们稍后会需要这个。

当我们纵向增加单元格的宽度时,我们可以downsample通过将单元格加在一起并对单元格的数量求平均值。这是由于纵向相邻(水平)单元的面积相等。如果我们downsampling的网格间距不是原始间距的整数倍,那么首先我们必须upsample,如上所述(这是您的要求..)。

最棘手的事情是在纬度上进行下采样。这是因为这里我们有不同的密度,并且与这些密度相关的实际区域也不同。处理这种情况的方法是:

  1. 上采样到一个新的纬度网格间距,它是我们初始纬度网格和我们想要的纬度网格的倍数(如上所述)。
  2. 计算每个细胞的细胞表面积(这是我们需要的公式)。
  3. 将这两个数组相乘以获得上采样数据数组中每个数据单元的总排放量。
  4. 将构成新单元的所有总排放单元加在一起(在整个阵列上执行此操作)
  5. 除以该新单元格的总面积(子单元格的所有面积之和),对所有新单元格执行此操作。
  6. 就是这样。

需要注意的坏事:

  1. 您的一些数据集之间存在纵向相位差异,这可以确保您正确地重新定位数据以允许这一点。

  2. 极细胞,在哪里latitude = 90 or -90。这些单元是有问题的,因为它们的纬度高度是所有其他单元的一半。这必须仔细考虑:确保为这些单元格计算的区域是正确的,并且当/如果上采样时,pole条目应该只重复一半以反映这一点。

于 2012-05-22T18:49:21.510 回答