第三篇 Python優雅地進行數據同化

我們在使用各種柵格化數據(或者網格數據,比如城市夜晚燈光,人口密度分佈等)的時候,經常會需要把下載到的數據的空間分辨率變成我們所需要的空間分辨率,這個時候你會怎麼辦呢?寫一個循環?然後一個格點一個格點地算?今天我加班提前更一篇博客,教你優雅地進行數據同化。(這個方法僅限於數據源與目標數據地格點間具有確定關係的情況,比如衛星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的靈活使用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章