2016-06-27 15 views
3

の形状が(1, n)であるといいます。私は形(1, n±x)の新しいincoming_dataを持っています。ここでxはnよりずっと小さな正の整数です。 incoming_dataを絞ったり伸ばしたりして、nと同じ長さにしたいと思います。 SciPyスタックを使用して、これをどのように行うことができますか?他の配列に合うように数値配列を補間する

ここに私が達成しようとしているものの例があります。別の例として

# Stretch arr2 to arr1's shape while "filling in" interpolated value 
arr1 = np.array([1, 5, 2, 3, 7, 2, 1]) 
arr2 = np.array([1, 5, 2, 3, 7, 1]) 
result 
> np.array([1, 5, 2, 3, 6.x, 2.x 1]) # of shape (arr1.shape) 

# Squeeze arr2 to arr1's shape while placing interpolated value. 
arr1 = np.array([1, 5, 2, 3, 7, 2, 1]) 
arr2 = np.array([1, 5, 2, 3, 4, 7, 2, 1]) 
result 
> np.array([1, 5, 2, 3.x, 7.x, 2.x, 1]) # of shape (arr1.shape) 
+0

FWIW、私は 'scipy.interpolate'を使ってみましたが、配列が同じ長さではないのでエラーが発生し続けているので、補間が正しく行われていないと思います。 – ericmjl

+1

'x = np.arange(arr2.size)'と 'arr2'をベーシスポイントとして' interpolate'を使い、 'np.linspace(0、arr2.size-1、arr1)で与えられた新しい' x'値に補間します。 .size) 'を実行します。これらの要素は補間値でなければなりません。 –

+0

Ooh!私は本当に答えに近い感じている:D。私はあなたが書いたことをやってみたが、まだブロックに当たっていた。 'scipy.interp1d(....)'関数呼び出しには何が入りますか? – ericmjl

答えて

6

あなたはこの単純な圧縮を実装したり、scipy.interpolate.interp1dを使用してデータの伸張することができます。私はそれが必ずしも意味をなさないと言っているわけではありません(あなたが使用している補間の種類には大きな違いがあり、基本的な関数の振る舞いを正しく推測できる場合は一般的に妥当な結果しか得られません)。それをやる。

元の配列をインデックスの上にxの値で補間してから、その端点を同じに保ちながら、より細かい補間を行います。だから、基本的に、あなたは必要なポイントでそれを自分の離散データに連続体近似を行うと、リサンプリングする必要があります。

import numpy as np 
import scipy.interpolate as interp 
import matplotlib.pyplot as plt 

arr_ref = np.array([1, 5, 2, 3, 7, 1]) # shape (6,), reference 
arr1 = np.array([1, 5, 2, 3, 7, 2, 1]) # shape (7,), to "compress" 
arr2 = np.array([1, 5, 2, 7, 1])  # shape (5,), to "stretch" 
arr1_interp = interp.interp1d(np.arange(arr1.size),arr1) 
arr1_compress = arr1_interp(np.linspace(0,arr1.size-1,arr_ref.size)) 
arr2_interp = interp.interp1d(np.arange(arr2.size),arr2) 
arr2_stretch = arr2_interp(np.linspace(0,arr2.size-1,arr_ref.size)) 

# plot the examples, assuming same x_min, x_max for all data 
xmin,xmax = 0,1 
fig,(ax1,ax2) = plt.subplots(ncols=2) 
ax1.plot(np.linspace(xmin,xmax,arr1.size),arr1,'bo-', 
     np.linspace(xmin,xmax,arr1_compress.size),arr1_compress,'rs') 
ax2.plot(np.linspace(xmin,xmax,arr2.size),arr2,'bo-', 
     np.linspace(xmin,xmax,arr2_stretch.size),arr2_stretch,'rs') 
ax1.set_title('"compress"') 
ax2.set_title('"stretch"') 

結果のプロット:プロットで

result

、青い丸があります元のデータ点、赤い四角は補間されたものです(これらは境界で重なります)。ご覧のとおり、私が圧縮と伸ばしと呼ぶものは、実際には、基礎となる(デフォルトでは線形の)関数のアップサンプリングとダウンサンプリングです。これが補間に非常に注意を払わなければならないと言った理由です。期待通りにデータが一致しないと、結果が非​​常に間違ってしまう可能性があります。

+0

それは完璧に動作し、アンドラ!そしてFWIW、私は[Pchipinterpolator](http://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.PchipInterpolator.html#scipy.interpolate)に行きました。PchipInterpolator)は、アプリケーションに特化した外挿が可能なため、必要なものです。 – ericmjl

+2

@ericmjl私は助けてくれると嬉しいです:)フィードバックに感謝します。補間関数から外挿するときは、制御できないエラーにつながる可能性があるので、特に注意してください。 (完全版のために:scipyバージョン0.17の 'interp1d'は、' full_value = 'extrapolate'というキーワードを用いて線形補間の外挿をサポートしています)。 –

関連する問題