簡體   English   中英

numpy:如何在兩個數組之間插值不同的時間步長?

[英]numpy: how interpolate between two arrays for various timesteps?

我正在尋找一種方法,可以在表示時間起點和終點的兩個numpy數組之間進行簡單的線性插值。

這兩個數組的長度相同:

fst = np.random.random_integers(5, size=(10.))
>>> array([4, 4, 1, 3, 1, 4, 3, 2, 5, 2])
snd = np.random.random_integers(5, size=(10.))
>>> array([1, 1, 3, 4, 1, 5, 5, 5, 4, 3])

在我的起點和終點之間,有3個時間步。 如何在fstsnd之間進行插值? 我希望能夠以fstsnd的第一項為例,檢索每個時間步的值,例如

np.interp(1, [1,5], [4,1])    
np.interp(2, [1,5], [4,1])
...
# that is
np.interp([1,2,3,4,5], [1,5], [4,1])
>>> array([ 4.  ,  3.25,  2.5 ,  1.75,  1.  ])

但是,不僅是第一個條目,而且還包括整個數組。

顯然,這不會做到:

np.interp(1, [1,5], [fst,snd])

好吧,我知道我會循環到達那里,例如

[np.interp(2, [1,5], [item,snd[idx]]) for idx,item in enumerate(fst)]
>>> [3.25, 3.25, 1.5, 3.25, 1.0, 4.25, 3.5, 2.75, 4.75, 2.25]

但是我相信當您使用numpy數組時,您所做的事情根本上是錯誤的。

如果您將樣本形成2D矩陣,則scipy.interpolate.interp1d中的設施使此操作非常容易。 在您的情況下,您可以構造2xN數組,並構造對列進行向下運算的插值函數:

from scipy.interpolate import interp1d
fst = np.array([4, 4, 1, 3, 1, 4, 3, 2, 5, 2])
snd = np.array([1, 1, 3, 4, 1, 5, 5, 5, 4, 3])
linfit = interp1d([1,5], np.vstack([fst, snd]), axis=0)

然后,您可以在感興趣的任何時間生成插值矢量。 例如linfit(2)產生:

array([ 3.25,  3.25,  1.5 ,  3.25,  1.  ,  4.25,  3.5 ,  2.75,  4.75,  2.25])

或者您可以使用時間值向量調用linfit() ,例如linfit([1,2,3])給出:

array([[ 4.  ,  4.  ,  1.  ,  3.  ,  1.  ,  4.  ,  3.  ,  2.  ,  5.  ,  2.  ],
       [ 3.25,  3.25,  1.5 ,  3.25,  1.  ,  4.25,  3.5 ,  2.75,  4.75,           2.25],
       [ 2.5 ,  2.5 ,  2.  ,  3.5 ,  1.  ,  4.5 ,  4.  ,  3.5 ,  4.5 , 2.5 ]])

如果僅執行線性插值,則還可以執行以下操作:

((5-t)/(5-1)) * fst + ((t-1)/(5-1)) * snd

在任何時間t直接計算插值向量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM