[英]How to do area-weighted regridding of regular lat-lon data using python
我希望能夠在python中對規則間隔的2D緯度 - 經度數據進行面積加權重新划分,例如從0.5x0.5網格到2.5x3.75網格。 這些數據是以kg /平方公尺/ s為單位的排放,因此我需要保存質量和空間分布。
我知道有一些scipy插值例程,我不確定哪個(如果有的話)在這種情況下最好用。 如果可能的話,我寧願不要安裝太多額外的python包,除非絕對需要(即我安裝了scipy + numpy,但寧願不必安裝專業的python包,它會做我需要的,也需要我將數據存儲在特定的類結構等中。但是,如果需要,我會這樣做!)。
這對我來說也是一個學習練習,可以理解如何在python中做這些事情,以及能夠做到這一點。
這是一個非常復雜的問題,答案相當復雜,並且有很多機會出錯。 正如你在評論中所說,你有經度,像這樣的緯度向量:
'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
條目應該重復一半以反映這一點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.