1. 程式人生 > >第三篇 優雅地進行資料同化

第三篇 優雅地進行資料同化

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