第三篇 优雅地进行数据同化

我们在使用各种栅格化数据(或者网格数据,比如城市夜晚灯光,人口密度分布等)的时候,经常会需要把下载到的数据的空间分辨率变成我们所需要的空间分辨率,这个时候你会怎么办呢?写一个循环?然后一个格点一个格点地算?今天我加班提前更一篇博客,教你优雅地进行数据同化。(这个方法仅限于数据源与目标数据地格点间具有确定关系的情况,比如卫星Level2到Level3的同化就不适用了,后者以后我们会说到,同样要等我的文章发表)

导入数据和所需库

实际上整个工作只需要用到numpy这一个库,但是呢,为了检验和展示,我们可以用matplotlib画出图来看看。另外这里我们还用到了scipy.stats这个库来计算众数。在进行数据同化的时候最常用的是简单的平均,但是也会有用到众数或者分位数的情况(比如对土地利用类型进行regrid)。

from scipy.stats import mode
from numpy import *
import matplotlib.pyplot as plt

数据导入这里就不说了,不同的数据格式有不同的方法,以后也会介绍一些。这里我们用随机数来代替所需要regrid的数据。

high_res = random.rand(100,150)

画出来看看

plt.pcolormesh(high_res)

在这里插入图片描述

好吧,这很高斯。。。

降低分辨率

假如我们想把原始数据的分辨率在两个方向上都减半(也就是降为原来的1/4),并且每个格点取对应原格点的众数,只需要简单几行:

low_res = high_res.reshape(50,2,75,2)
low_res = swapaxes(low_res,1,2).reshape(50,75,-1)
low_res = mode(low_res,2)[0].squeeze()

简单得让我想把它扔到基础篇去。一样的画出来看看。其实这个地方取众数没有意义,只是为了演示方法(因为每个大格点对应的四个小格点的随机数几乎不可能有一样的)
在这里插入图片描述

同化到高分辨率网格

注意,这个并不是真的让图片分辨率变高,只是同化到高分辨率网格上去。现在我们把这个100x150的数据同化到200*300的格点上去:

ul_res = concatenate([high_res.reshape(100,150,1) for i in range(4)],axis = 2)
ul_res = ul_res.shape(100,150,2,2)
ul_res = swapaxes(ul_res,1,2)
ul_res = ul_res.reshape(200,300)

由于没有信息的增减,所以画出来和第一幅图一样:
在这里插入图片描述
如果你的目标分辨率与你手上的数据分辨率不是整数关系,那也没有关系,我们可以找一个格点数的最小公倍数,分辨率先增再降,先后进行上面两步就可以实现了。重点在于reshape和swapaxes的灵活使用。

猜你喜欢

转载自blog.csdn.net/weixin_43086925/article/details/84640365