我們氣象上常用的降水ts評分,細分的話,可以分為晴雨ts、強降水ts、分量級ts等。以晴雨ts為例:
其中,na為有降水預報正確站(次)數,nb為空報站(次)數,nc為漏報站(次)數,nd為無降水預報正確的站(次)數,如下表:
對於強降水或者分級降水的預報ts評分,則更關注降水區間內預報正確的站(次)數(na),而對於nd(無強降水預報正確的站(次)數)則並不是很關注。因此這一項的ts評分中,分母為na+nb+nc,分子為na:
此前我們寫ts降水評分的**的時候,總是將降水和實況的每乙個值進行對比,來計算na,nb,nc和nd,像是這樣:
for i in range(obsdata[0]): for j in range(obsdata[1]): obs, pre = obsdata[i, j], predata[i, j] if obs > 999: obs = np.nan if pre > 999: pre = np.nan if np.isnan(obs) or np.isnan(pre): continue if (obs >= t) and (pre >= t): # 預報正確 na = na + 1 elif (obs >= t) and (pre # 漏報 nc = nc + 1 elif (obs and pre >= t): nb = nb + 1 elif (obs and pre nd = nd + 1if ((na+nb+nc) == 0): ts = 0else: ts = na/(na+nb+nc)
這種乙個個變數去對比的演算法,對於資料量小一點的情況還好,站點要是比較密集,這個迴圈就要跑個兩三分鐘。所以為了加快速度,我們經常是用fortran來實現這個迴圈。
直到前幾天,老蔡突然靈光一現,說反正就是判斷在不在那個區間裡面,直接用python的邏輯判斷不就行了嗎~
lr = np.logical_and(sc_data>=0.1,sc_data<10) #小雨(24小時降水)mr = np.logical_and(sc_data>=10,sc_data<25) #中雨(24小時降水)br = np.logical_and(sc_data>=25,sc_data<50) #大雨(24小時降水)type_sc = np.zeros_like(sc_data).astype(int)type_sc[lr]=1type_sc[mr]=2type_sc[br]=3type_sc[sc_data>=50]=4 #暴雨(24小時降水)sr_na = np.logical_and(type_dc==1,type_data==1)sr_nbnc = np.logical_or(type_dc==1,type_data==1)sc_sr_na = np.zeros_like(sc_data).astype(int)sc_sr_na[sr_na] = 1sc_sr_nbnc = np.zeros_like(sc_data).astype(int)sc_sr_nbnc[sr_nbnc] = 1np.sum(sc_sr_na)/np.sum(sc_sr_nbnc)
我們把這個邏輯算出來的評分,跟原來乙個乙個變數對比的方法算出來的評分對比了一下,完全相等哦,但是速度快了很多!因為python的這個邏輯對比的演算法,是不走迴圈 氣象ts評分 TS平分
盟 8 g e z.a3 u q 如果給定的資料是各次預報和觀測的值,和 ets評分的閾值,則用如下 其中多出一段判斷命中 空報 漏 報和正確否定次數的 對 ts評分也一樣。氣象數值 模式氣象數 值模式數值模式氣象 模式海洋模式氣候 模式,wrf mm5,grapes,hycom,li com,同化...