對于氣象繪圖來講,第一步是對數據的處理,通過各類公式,或者統計方法將原始數據處理為目標數據。
按照氣象統計課程的內容,我給出了一些常用到的統計方法的對應函數:
import numpy as np
平均值
在計算氣候態,區域平均時均要使用到求均值函數,對應NCL中的dim_average函數,在python中通常使用np.mean()函數
numpy.mean(a, axis, dtype)
假設a為[time,lat,lon]的數據,那么
·axis 不設置值,對 timelatlon 個值求均值,返回一個數
·axis = 0:壓縮時間維,對每一個經緯點求均值,返回 [lat, lon] 數組(如求一個場的N年氣候態)
·axis =1,2 :壓經度緯度,對每個時間求平均值,返回 [time] 矩陣(如求某時間序列,或指數)
需要特別注意的是,氣象數據中常有缺測,在NCL中,使用求均值函數會自動略過,而在python中,當任意一數與缺測(np.nan)計算的結果均為np.nan,比如求[1,2,3,4,np.nan]的平均值,結果為np.nan
因此,當數據存在缺測數據時,通常使用np.nanmean()函數,用法同上,此時[1,2,3,4,np.nan]的平均值為(1+2+3+4)/4 = 2.5
同樣的,求某數組最大最小值時也有np.nanmax(), np.nanmin()函數來補充np.max(), np.min()的不足。
其他很多np的計算函數也可以通過在前邊加‘nan’來使用。
另外,
a[np.isnan(a)] = 0
也可以直接將a中缺失值全部填充為0。
標準差
np.std(a, axis, dtype)
用法同np.mean()
標準化
在NCL中有直接求數據標準化的函數dim_standardize()
我目前并未找到python中可以直接求數據標準化的函數(sklearn庫中有標準化,但感覺不如公式直接計算方便)。根據公式,
x = (x - np.mean(x)) / np.std(x)
其實也就是一行的事,根據需要指定維度即可。
相關系數
皮爾遜相關系數:
相關可以說是氣象科研中最常用的方法之一了,numpy函數中的np.corrcoef(x, y)就可以實現相關計算。但是在這里我推薦scipy.stats中的函數來計算相關系數:
from scipy.stats import pearsonr
r,p = pearsonr(x, y)
這個函數缺點和有點都很明顯,優點是可以直接返回相關系數R及其P值,這避免了我們進一步計算置信度。而缺點則是該函數只支持兩個一維數組的計算,也就是說當我們需要計算一個場和一個序列的相關時,我們需要循環來實現。
r = np.zeros((a.shape[1],a.shape[2]))
p = np.zeros((a.shape[1],a.shape[2]))
for i in range(sic.shape[1]):
for j in range(sic.shape[2]):
r[i,j], p[i,j] = pearsonr(b , a[:,i,j])
其中a[time,lat,lon],b[time]
線性回歸系數
(NCL中為regcoef()函數)
同樣推薦Scipy庫中的stats.linregress(x,y)函數:
slope, intercept, r_value, p_value, std_err = stats.linregress(x,y)
slop: 回歸斜率
intercept:回歸截距
r_value: 相關系數
p_value: P值
std_err: 估計標準誤差
直接可以輸出P值,同樣省去了做置信度檢驗的過程,遺憾的是仍需同相關系數一樣循環計算。