我有一對來自網格資料集(GeoTIFF 格式)的二維陣列,它們都具有完全相同的解析度和行/列數。
假設陣列#1 的時間步長為 0 小時,陣列#2 的時間步長為 3 小時。我希望在線性插值中以 [1,2] 的間隔插入和創建額外的陣列。
我已經仔細閱讀了這個關于利用 scipy 通過堆疊的一維陣列實作這一點的鏈接,但如果可能的話,我更愿意在 NumPy 中執行它。
生成這些處于預定間隔的附加插值二維陣列的最佳方法或起點是什么?
uj5u.com熱心網友回復:
我相信你只是在問如何做到這一點:
import numpy as np
t0 = 0
a0 = np.array([[0,0,0],[1,1,1],[2,2,2]], dtype=np.float64)
t3 = 3
a3 = np.array([[3,3,3],[0,5,0],[-2,0,2]], dtype=np.float64)
aDiff = a3 - a0
t1 = 1
a1 = a0 aDiff * ((t1 - t0) / (t3 - t0))
t2 = 2
a2 = a0 aDiff * ((t2 - t0) / (t3 - t0))
print(a0)
print(a1)
print(a2)
print(a3)
輸出:
[[0. 0. 0.]
[1. 1. 1.]
[2. 2. 2.]]
[[1. 1. 1. ]
[0.66666667 2.33333333 0.66666667]
[0.66666667 1.33333333 2. ]]
[[ 2. 2. 2. ]
[ 0.33333333 3.66666667 0.33333333]
[-0.66666667 0.66666667 2. ]]
[[ 3. 3. 3.]
[ 0. 5. 0.]
[-2. 0. 2.]]
如果你想要一個更通用的解決方案,你可以這樣做:
- 將 2D 輸入陣列之間的差異重塑為 1D
- 對所需的 n 次插值重復此行 n 次
- 將第 i 行乘以相應的插值因子 (t[i] - tFirst) / (tNext - tFirst) 以使每一行包含該插值時間所需的插值步驟
- 將第一個 2D 陣列的重復 1D 行版本添加到這些插值步驟中,以獲得逐行 1D 形狀的結果
- 在每個插值時間重塑為包含 2D 結果的 3D 陣列
示例代碼:
import numpy as np
tFirst, aFirst = 0, np.array([[0,0,0],[1,1,1],[2,2,2]], dtype=np.float64)
tNext, aNext = 3, np.array([[3,3,3],[0,5,0],[-2,0,2]], dtype=np.float64)
tInterp = np.array([1, 2])
aDiff1D = np.reshape(aNext - aFirst, (1, np.size(aFirst)))
aDiffRepeated = np.repeat(aDiff1D, np.size(tInterp), axis=0)
aStep = aDiffRepeated * ((tInterp[:, None] - tFirst) / (tNext - tFirst))
aInterp = np.repeat(np.reshape(aFirst, (1, np.size(aFirst))), np.size(tInterp), axis = 0) aStep
aInterp = np.reshape(aInterp, (np.size(tInterp), aFirst.shape[0], aFirst.shape[1]))
a1 = aInterp[0]
a2 = aInterp[1]
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/473656.html
