氣象ts評分 利用邏輯判斷提公升TS評分計算效率

2021-10-13 20:17:18 字數 1975 閱讀 5599

我們氣象上常用的降水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,同化...