2016-04-04 6 views
4

私は、2つのnumpy配列の間で単純な線形補間を行う方法を探しています。 3つのタイムステップがあり、私のスタートとエンドポイントの間numpy:さまざまなタイムステップの2つの配列をどのように補間するのですか?

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]) 

二つの配列

は同じ長さを有しています。 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. ]) 

しかし、最初のエントリのためではなく、配列全体にわたりだけではない以下のような各タイムステップの値を取得するには、例としてfstsndの最初のエントリを取って、できるようにしたいです。明らかに

、これはそれを行うことはありません。

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配列を覆っていると信じています。

答えて

1

scipy.interpolate.interp1dの施設では、サンプルを2Dマトリックスに形成すると、これを非常に簡単に行うことができます。あなたのケースでは、あなたは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 ]]) 

あなただけの線形補間をやっている場合は、あなたも同じような何かを行うことができます:直接、任意の時刻tにおける補間されたベクトルを計算するために

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

を。

関連する問題