2017-05-14 9 views
0

私は、2つの配列のデータペアのサンプルを持っています。たとえば、:データサンプルの整形

times = [0, 1, 3, 3.5, 5, 6] 
values = [1, 2, 3, 4, 5, 6] 

時刻0では、値は1、時刻1では2などとなります。あなたが見ることができるように、時間値は規則的な時間距離ではありません(すべての場合において昇順に並べられていますが)。もちろん

enter image description here

私はループを作ることができる:私は、これらの値は中間値からこのプロットに基づいて算出されている

times1 = [0, 1, 2, 3, 4, 5, 6] 
values = [1, 2, 2.5, 3, 4.333, 5, 6] 

に上記変換する効率的な方法を求めていますこれらの値を見つけて、それらをターゲット配列に入れてください。しかし、私はnumpyがそれを "すぐに"行う何かを持っているのだろうかと思います。

NB:Thisは、私が望むものに似ています(しかし、少し些細ですが)ので、箱から何もないと思います。しかし、誰が知っている。 scipyのダウンロードと

+0

ループでどのように行うかを教えてください。 – hpaulj

+1

times1と値には同じ数の要素がありません。あなたは補間を探しているようですが。 scipyにはそのための機能があります。パンダでもっと楽になります。 – ayhan

+0

@ayhanあなたは正しいです、申し訳ありません。 –

答えて

1

、あなたはinterp1dを使用することができます:パンダで

from scipy.interpolate import interp1d  
f = interp1d(times, values) 

f(times1) 
Out: 
array([ 1.  , 2.  , 2.5  , 3.  , 4.33333333, 
     5.  , 6.  ]) 

が、これもまた可能である:

ser = pd.Series(values, index=times) 
ser2 = pd.Series(index=times1) 

ser.combine_first(ser2).interpolate(method='index').reindex(ser2.index) 
Out: 
0 1.000000 
1 2.000000 
2 2.500000 
3 3.000000 
4 4.333333 
5 5.000000 
6 6.000000 
dtype: float64 

combine_firstは、両方の指標の和をとります。 interpolateはジョブを実行する主な方法です。インデックス上で線形補間を行っているので、method='index'を渡す必要があります。

+0

私はそれを試してみたいですが、今のところ私は 'module'オブジェクトには 'interpolate'属性がありません。そのような場合に推奨されるようにアップグレードするためにpipを使用しました。そうでなければ、これは私が必要とするものになります。 –

+0

@ThomasKilianバージョン0.14で追加されたようです。 'scipy.interpolate import interp1d'は動作しますか? – ayhan

+1

それは:-)パンダも動作します。私に多くのループを保存しました:-) –