2014-04-11 5 views
9

Griddata को नीचे कॉल क्यों विफल रहता है?Scipy - 3d griddata - griddata xi तर्क को टुपल करने के लिए क्यों जरूरी है?

import scipy.interpolate 
import numpy as np 
grid_vals = np.meshgrid(*([np.linspace(-1,1,200)] * 3)) 
interp_vals = scipy.interpolate.griddata(np.random.randn(50,3), np.random.randn(50), grid_vals, 'linear') 

निम्नलिखित अपवाद तब होता है: ValueError: xi में आयामों की संख्या एक्स

मेल नहीं खाती है मैं xi (grid_vals) तर्क डाली टपल करने के लिए:

interp_vals = scipy.interpolate.griddata(np.random.randn(50,3), np.random.randn(50), tuple(grid_vals), 'linear') 

त्रुटि हो जाता है दूर। क्यूं कर?

उत्तर

3

बुनियादी क्यों कि griddata गुजरता दोनों points और xi एक points = _ndim_coords_from_arrays(points) समारोह जिसका प्रलेखन पढ़ता है के माध्यम से है: tuples पर

Convert a tuple of coordinate arrays to a (..., ndim)-shaped array. 

और महत्वपूर्ण कार्य है: और

p = np.broadcast_arrays(*points) 

कुछ भी, सूची सहित , सिर्फ एक सरणी में परिवर्तित किया गया है:

points = np.asanyarray(points) 

वास्तविक इंटरपोलेशन '3 डी' आयाम के साथ सरणी की अपेक्षा करता है।

तो आपकी सूची 3 (200,200,200) सरणी (3,200,200,200) आकार की एक सरणी बन जाती है। लेकिन आपका points सरणी (50,3) है। number of dimensions in xi does not match x200 से संदेश परिणाम 3 से मेल नहीं खाते।

griddata दस्तावेज points के बारे में स्पष्ट है, xi के लिए कम है। लेकिन इसका उदाहरण mgrid से सरणी का उपयोग करके (x, Y) का उपयोग करता है।

तो यह काम करेगा:

X, Y, Z = np.meshgrid(*([np.linspace(-1,1,200)] * 3)) 
interp_vals = scipy.interpolate.griddata(points, values, (X,Y,Z), 'linear') 

अपने meshgrid सूची से आवश्यक सरणी पैदा करने का एक और तरीका है यह एक सरणी बनाने के लिए, और रोल 1 आयाम

grid_vals = np.rollaxis(np.array(grid_vals),0,4) 

पैदा करने का एक और तरीका एक जाल np.ix_ है, जो ट्यूपल के रूप में एक खुली जाल देता है। इस तरह के एक खुले जाल प्रसारण की जरूरत है।

एक सिंगल प्वाइंट के साथ अंतर्वेशित किया जाएगा या तो:

interpolate.griddata(points,values,[[[[0,0,0]]]],'linear') 
interpolate.griddata(points,values,([0],[0],[0]),'linear') 

देखें जॉन 4123 पुल अनुरोध करने के लिए प्रतिक्रिया whys के बारे में अधिक चर्चा है।

1

यह क्योंकि अंतर्निहित scipy लगाना मॉड्यूल कोड है कि सही ढंग से बहु-आयामी tuples और नहीं बहुआयामी सूचियों संभालती है में नाकाम रहने के है:

https://github.com/scipy/scipy/blob/master/scipy/interpolate/interpnd.pyx#L167

मैं issue 4123 और pull request 4124 बना लिया है इस मुद्दे को ठीक करने के लिए, पर कम से कम सूचियों के लिए।

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