以Voronoi圖進行環保署測站數據之空間外插
Table of contents
背景
程式差異
執行結果比較
計算各網格點的濃度
- 此一階段將日均值計算結果(
var
、維度依序為:[測項、日期、測站]
),與Voronoi圖的測站分配結果(fac1
,維度依序為:[測站、網格]
),以內積方式進行相乘 fac1
之準備詳下,var
之矩陣作法同stn_dot
llv=pd.read_csv('/nas2/cmaqruns/2022fcst/fusion/Voronoi/gridLLvor.csv')
nxy=393*276
if len(llv)!=nxy:sys.exit('wrong grid matching')
all_stn=set(list(llv.AQID))
ns=len(all_stn)
seq=list(all_stn)
seq.sort()
seqn={seq[i]:i for i in range(ns)}
fac1=np.zeros(shape=(ns,nxy))
for t in range(nxy):
i=llv.AQID[t]
fac1[seqn[i],t]=1.
...
res1=np.ma.dot(var,fac1)
鄉鎮區範圍內網格濃度之平均
- 前階段結果(
res1
、維度為[測項、日期、網格]
),與鄉鎮區在各網格點內之分配(fac2
),維度為[網格、鄉鎮區]
,進行內積計算。 - 過去這項作業是使用
pandas.pivot_table
來計算,此處因測項與時間等維度都較複雜,pandas雖然也有平行運算功能,但仍然較比np.ma.dot
慢了許多。
sw=set(llv.TOWNCODE)
nw=len(sw)
seq=list(sw)
seq.sort()
seqn={seq[i]:i for i in range(nw)}
fac2=np.zeros(shape=(nxy,nw))
for t in range(nw):
a=llv.loc[llv.TOWNCODE==seq[t]]
n=len(a)
for i in a.index:
fac2[i,t]=1./n
res=np.ma.dot(res1,fac2)
- 經測試,程式可以使用到master的12核心(total 20)、devp的64核心(total 100)進行平行計算。
處理結果比較
| |
---|
stn_dot結果 | stn_dotV結果 |
| | |
---|
stn_dot結果 | stn_dotV結果 | LGHAP2009結果 |
程式下載