我希望能够在python中执行规则间隔的2D纬度 - 经度数据的面积加权重新划分,例如,例如,从0.5x0.5网格到2.5x3.75网格。这些数据是以kg /平方公尺/ s为单位的排放,因此我需要保存质量和空间分布。
我知道有许多scipy插值例程,我不确定哪个(如果有的话)在这种情况下最好用。如果可能的话,我宁愿不要安装太多额外的python包,除非绝对需要(即我安装了scipy + numpy,但宁愿不必安装专业的python包,它会做我需要的,也需要我将数据存储在特定的类结构等中。但是,如果需要,我会这样做!)。
这对我来说也是一个学习练习,可以理解如何在python中做这些事情,以及能够做到这一点。
答案 0 :(得分: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
,如上所述(这是您的要求......)。
最棘手的事情是在纬度上进行下采样。这是因为这里我们有不同的密度,与这些密度相关的实际面积也不同。解决这个问题的方法是:
要注意的不好的事情:
您的某些数据集之间存在纵向阶段差异,这可能会非常繁琐,以确保您正确地重新定位数据以实现此目的。
极细胞,latitude = 90 or -90
。这些细胞是有问题的,因为它们具有与所有其他细胞一样的纬度高度的一半。必须谨慎地允许:确保为这些单元格计算的区域是正确的,并且当/如果进行上采样时,pole
条目应该只重复一半以反映这一点。