背景
- 這個內插機制主要針對2維griddata速度太慢所因應的修改方案。同時也需要規避griddata結果會有NaN內插錯誤的結果。
- 主要因為空氣品質或排放量的內插會與距離的遠近有關,太遠的數據對內插影響也較低,還是適用距離相關的內插機制較為合理。同時摒除遙遠的數據對提升計算速度有非常重要的貢獻。
- 程式主要應用在每日的下載與軌跡分析過程,參見[[2022-11-04-daily_traj]]1。
程式設計重點
2組網格座標位置之線性化
- 以適用即將進行的篩選(2維空間的線性化)過程、同時也簡化程式設計
- 字尾0/1表示舊、新的座標系統
for i in 'xy':
for j in '01':
exec(i+j+'='+i+j+'.flatten()')
計算相對距離並進行篩選
- 以新網格間距5倍範圍為限
- 取距離平方之倒數為加權依據
- 以n[ ]、w[ ]等2個序列將順位及加權陣列(3 ~ 105不等長)都記錄起來。
- 這2個序列不會隨著時間改變,可以另存備用。
- 但因為計算速度很快,沒有必要儲存,不是速率決定關鍵。
n,w=[],[]
for i in range(ncol1*nrow1):
dist=(x0-x1[i])**2+(y0-y1[i])**2
boo=(dist<=(nc1.XCELL*5)**2) & (dist>0)
idx=np.where(boo)[0]
if len(idx)==0:sys.exit('distance too short')
wgt=1./dist[idx]
swgt=np.sum(wgt)
wgt[:]/=swgt
n.append(idx)
w.append(wgt)
weight(w) and index(n)的引用
- 將原來2維的griddata內插,改成龐大矩陣的sum_product。這是速率提升的關鍵因素。
- 有關sum_product的說法,numpy與excel有不同的意義,網路有很多介紹,大多用在整個矩陣的相乘(np.dot(),np.matmul(), einsum()等等作法)、不適用在我們全部相乘、部份不加總的情況。
- 因為每點的加權與指標數量都不同,因此還是需逐一進行篩選、再進行sum_product
- w[i]是個較小的1維numpy陣列,其長度與c的最後軸(axis=3)相同,因此直接相乘再相加就會消除其維度了。
var1=np.zeros(shape=(nv,nt1,nlay1,nrow1*ncol1))
for i in range(ncol1*nrow1):
c = var[:,:,:,n[i]//ncol, n[i]%ncol]
var1[:,:,:,i]=np.sum(c*w[i],axis=3)
線性矩陣之還原
var1=var1.flatten().reshape(nv,nt1,nlay1,nrow1,ncol1)
-
https://sinotec2.github.io/FAQ/2022/11/04/daily_traj.html “ daily_traj.cs” ↩