पर जेड-वैल्यू को इंटरपोलेट करें (एक्स, वाई, जेड) में बिंदुओं के एक सेट को देखते हुए जो सतह पर बिंदु हैं , मैं मनमाना (एक्स, वाई) निर्देशांक पर जेड-वैल्यू को अलग करने में सक्षम होना चाहता हूं। मुझे ग्रिड पर मूल्यों को इंटरपोल करने के लिए mlab.griddata का उपयोग करके कुछ सफलता मिली है, लेकिन मैं किसी भी (एक्स, वाई) समन्वय के लिए सामान्य उपयोग फ़ंक्शन को कॉल करने में सक्षम होना चाहता हूं।(एक्स, वाई, जेड) में परिभाषित बिंदुओं के एक सेट को देखते हुए, मनमानी (एक्स, वाई)
अंक का सेट मोटे तौर पर गोलार्द्ध सतह बनाता है। समस्या को सरल बनाने के लिए, मैं एक विधि लिखने की कोशिश कर रहा हूं जो नीचे एक्स, वाई, और जेड निर्देशांक द्वारा परिभाषित गोलार्ध के ज्ञात बिंदुओं के बीच मूल्यों को विभाजित करता है। यद्यपि एक सही क्षेत्र के लिए z = f (x, y) खोजने के लिए एक विश्लेषणात्मक समाधान है, जैसे कि आपको इंटरपोलेट करने की आवश्यकता नहीं है, बिंदुओं का वास्तविक सेट एक सही क्षेत्र नहीं होगा, इसलिए हमें यह मानना चाहिए कि हमें आवश्यकता है अज्ञात (एक्स, वाई) निर्देशांक पर मूल्यों को अलग करने के लिए। Link to IPython notebook with point data
resolution = 10
u = np.linspace(-np.pi/2, np.pi/2, resolution)
v = np.linspace(0, np.pi, resolution)
U, V = np.meshgrid(u, v)
xs = np.sin(U) * np.cos(V)
ys = np.sin(U) * np.sin(V)
zs = np.cos(U)
मैं scipy.interpolate.interp2d
, जो उपयोग किया गया है "एक समारोह जिसका कॉल विधि नए अंक के मूल्य को खोजने के लिए पट्टी प्रक्षेप का उपयोग करता है देता है।"
def polar(xs, ys, zs, resolution=10):
rs = np.sqrt(np.multiply(xs, xs) + np.multiply(ys, ys))
ts = np.arctan2(ys, xs)
func = interp2d(rs, ts, zs, kind='cubic')
vectorized = np.vectorize(func)
# Guesses
ri = np.linspace(0, rs.max(), resolution)
ti = np.linspace(0, np.pi * 2, resolution)
R, T = np.meshgrid(ri, ti)
Z = vectorized(R, T)
return R * np.cos(T), R * np.sin(T), Z
दुर्भाग्य से मैं बहुत अजीब परिणाम प्राप्त, इसी तरह एक और StackOverflow user who tried to use interp2d करने के लिए।
सर्वाधिक सफलता मैं अब तक पाया है inverse squares उपयोग कर रहा है (एक्स, वाई) में जेड के मूल्य का अनुमान। लेकिन यह कार्य Z = 0 के पास ज़ेड के मानों का आकलन करने के लिए सही नहीं है।
क्या मैं एक समारोह z = f(x, y)
(एक्स, वाई, जेड) में अंक का एक सेट दिया पाने के लिए कर सकते हैं? क्या मुझे यहां कुछ याद आ रहा है ... क्या मुझे सतह पर एक मूल्य का अनुमान लगाने के लिए एक बिंदु बादल से अधिक की आवश्यकता है?
संपादित करें:
इस समारोह है कि मैं लेखन समाप्त हो गया है। फ़ंक्शन xs, ys, zs
के इनपुट सरणी लेता है और का उपयोग करके x, y
पर इंटरपोलेट करता है, जिसके लिए नियमित ग्रिड की आवश्यकता नहीं होती है। मुझे यकीन है कि ऐसा करने का एक शानदार तरीका है और किसी भी अपडेट की सराहना करता है, लेकिन यह काम करता है और मैं प्रदर्शन से चिंतित नहीं हूं। एक स्निपेट सहित अगर यह भविष्य में किसी की भी मदद करता है।
def interpolate(x, y, xs, ys, zs):
r = np.sqrt(x*x + y*y)
t = np.arctan2(y, x)
rs = np.sqrt(np.multiply(xs, xs) + np.multiply(ys, ys))
ts = np.arctan2(ys, xs)
rs = rs.ravel()
ts = ts.ravel()
zs = zs.ravel()
ts = np.concatenate((ts - np.pi * 2, ts, ts + np.pi * 2))
rs = np.concatenate((rs, rs, rs))
zs = np.concatenate((zs, zs, zs))
Z = scipy.interpolate.griddata((rs, ts), zs, (r, t))
Z = Z.ravel()
R, T = np.meshgrid(r, t)
return Z
मशीन सीखने का उपयोग करें। :) – erip
क्या आपने scipy.interpolate.LinearNDInterpolator की कोशिश की है? इस प्रकार की समस्याओं के लिए मेरे पास अच्छे अनुभव हैं –