2016-02-12 9 views
5

मैं सतह के लिए इंटरपोलेशन फ़ंक्शन बनाने के लिए scipy.interpolate.interp2d का उपयोग कर रहा हूं। मेरे पास वास्तविक डेटा के दो सरणी हैं जिनके लिए मैं इंटरपोलेटेड पॉइंट्स की गणना करना चाहता हूं। अगर मैं 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)) 

मेरा प्रश्न है वहाँ एक बेहतर (और अधिक सुरुचिपूर्ण है, पाइथोनिक?) एक ही परिणाम प्राप्त करने का तरीका?

उत्तर

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

धन्यवाद एंड्रेस, सूची कंप महान काम करता है। जब मेरे पास अधिक समय होता है तो मैं griddata पर एक नज़र डालूंगा - मेरे पास अब के लिए काम करने की ज़रूरत है, इसलिए थोड़ी देर बाद स्पीड अप देख सकते हैं। बेन – BMichell

2

कोशिश * args और टपल पैकिंग/

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)] 
एक तरफ ध्यान दें, "जादू स्टार" के रूप में

खोल के लिए ज़िप अनुमति देता है अपने स्वयं के व्यस्त हो!

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

अपने सभी बिंदुओं को एक बार में पास करना शायद पाइथन में उनके ऊपर लूपिंग से काफी तेज होगा। आप 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 पैरामीटर के बिना (यह हमेशा एक -1 डी उत्पादन देता है)।

संबंधित मुद्दे