[英]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個時間步。 如何在fst
和snd
之間進行插值? 我希望能夠以fst
和snd
的第一項為例,檢索每個時間步的值,例如
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.