2016-02-12 23 views
5

Bir yüzey için enterpolasyon işlevi oluşturmak için scipy.interpolate.interp2d kullanıyorum. Sonra, enterpolasyonlu noktaları hesaplamak istediğim iki gerçek veri dizim var. İki diziyi interp2d işlevine iletersem, yalnızca noktaların değil, tüm noktaların bir dizisini alırım. BunaKoordinat çiftleri için SciPy interp2D

Çözümümün koordinat çiftleri bir liste halinde iki dizi sıkıştırır ve bir döngüde interpolasyon fonksiyonunun bu geçmek için:

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

sorum bir daha iyi (daha zarif, orada Pythonic?) Aynı sonuca ulaşma yolu?

cevap

1

İlk olarak, size döngü içinde

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

yapabilirsiniz. Veya daha da iyisi, döngüyü değiştirerek, yalnızca

.

Farklı bir notta, I suggest using interpolate.griddata yerine. interp2d'dan daha iyi davranmaya eğilimlidir ve girdi olarak rasgele şekilli noktaları kabul eder. Gördüğünüz gibi, interp2d interpolatörleri, sadece bir örgü üzerindeki değerlerini döndürecektir.

+1

Teşekkürler Andras, liste comp harika çalışıyor. Daha fazla zamanım olduğunda griddata'ya bakacağım - şu an için çalışmam gereken şeye sahibim, bu yüzden daha sonra hız artışlarına bakabilirim. Ben – BMichell

2

deneyin

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

ya da sadece

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

veya bir yan not olarak, "sihirli yıldız" olarak sadece

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

açma * args ve kayıt düzeni ambalaj/zip verir kendi tersi olmak!

points = zip(x, y) 
x, y = zip(*points) 
2

Tüm noktalarınızı bir kerede geçmek, muhtemelen Python'da döngüden çok daha hızlı olacaktır. Sen scipy.interpolate.griddata kullanabilirsiniz:

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

veya scipy.interpolate.BivariateSpline sınıflarından birini, mesela 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 da benzer biçimde çalışır, ancak grid=False parametre olmadan (her zaman bir 1D çıkışı verir).