2016-02-12 14 views
5

私はscipy.interpolate.interp2dを使ってサーフェスの補間関数を作成しています。次に、補間点を計算したい実際のデータの2つの配列があります。 2つの配列をinterp2d関数に渡すと、ポイントのペアだけでなく、すべてのポイントの配列が得られます。これ座標ペアのSciPy interp2D

マイ溶液は座標対とループの補間関数にこれを渡すのリストに二つの配列を圧縮することである。

f_interp = interpolate.interp2d(X_table, Y_table,Z_table, kind='cubic') 

co_ords = zip(X,Y) 
out = [] 
for i in range(len(co_ords)): 
    X = co_ords[i][0] 
    Y = co_ords[i][1] 
    value = f_interp(X,Y) 
    out.append(float(value)) 

私の質問は、より良い(よりエレガントありますPythonic?)同じ結果を達成する方法?

答えて

1

一つは、あなたのループに

for Xtmp,Ytmp in zip(X,Y): 
    ... 

を行うことができます。またはそれ以上に、ちょうど

out = [float(f_interp(XX,YY)) for XX,YY in zip(X,Y)] 

ループを置き換えます。

別の注記では、代わりにI suggest using interpolate.griddataです。それはinterp2dよりもはるかによく動作する傾向があり、任意の形状の点を入力として受け入れます。あなたが見てきたように、interp2d補間器はあなたにメッシュの値を返します。

+1

ありがとうAndras、リストの偉大な作品です。私はもっ​​と時間があるときにグリッドデータを見てみましょう - 私は今働いている必要があるので、少し後でスピードアップを見ることができます。ベン – BMichell

2

は "魔法のスター" とはジップを可能にする、サイドノートとして

points = zip(X, Y) 
out = [] 
for p in points: 
    value = f_interp(*p) 
    out.append(float(value)) 

か、単に

points = zip(X, Y) 
out = [float(f_interp(*p)) for p in points] 

か、単に

out = [float(f_interp(*p)) for p in zip(X, Y)] 

を開梱/ *引数とタプル梱包をお試しくださいそれ自身の逆です!

2

すべてのポイントを一度に渡すことは、おそらくPythonでそれらをループするよりもずっと速いでしょう。あなたはscipy.interpolate.griddataを使用することができます。

Z = interpolate.griddata((X_table, Y_table), Z_table, (X, Y), method='cubic') 

またはscipy.interpolate.BivariateSplineクラスのいずれか、例えばSmoothBivariateSpline

itp = interpolate.SmoothBivariateSpline(X_table, Y_table, Z_table) 
# NB: choose grid=False to get an (n,) rather than an (n, n) output 
Z = itp(X, Y, grid=False) 

CloughTocher2DInterpolatorも同様に機能するが、grid=Falseパラメータせず(それは常に1D出力を返します)。