[AstroPy] LinearNDInterpolator

Jonathan Slavin jslavin at cfa.harvard.edu
Tue Apr 26 14:24:39 EDT 2011


Erik,

Thanks for the response.  I didn't understand that the object returned
was a function which one then has to call with the desired coordinates.
I get it now.  

Unfortunately it seems to be not as fast as I'd hoped.  The simple
function that I wrote, which takes the "effective indices" for the
arrays and returns an array of interpolated values is much faster.
Mostly that's because it requires a 3-D grid for input so using the
effective indices is a simple vector operation.  I don't know how many
people would have use for my routine or if such a routine already exists
out there somewhere (it seems there must) but in any case I'd be happy
to make it available if anyone wants it.

Jon

> I'm not clear on what you're asking about LinearNDInterpolator in your
> second paragraph... what linear interpolator does is take in a list of
> coordinates and the corresponding values at those points (they can be
> gridded or not), and then can be used to give you the data value at
> any point inside the point values (although it does *not* extrapolate
> beyond the input points).  Is that what you want? If not, please
> clarify, or if so, see the example below for a sample usage - it makes
> a grid of points that represent a 3d gaussian and then uses the
> interpolator to do (I think) what you want.
> 
> 
> 
> 
> from numpy import mgrid,exp,array
> from scipy.interpolate import LinearNDInterpolator
> 
> #x,y,and z are 11x11x11 arrays with the x,y, and z values for a 3d box
> from -1 to 1
> x,y,z = mgrid[-1:1:11j,-1:1:11j,-1:1:11j]
> 
> #s is a gaussian evaluated at the grid points - replace this with your
> grid values
> s = exp(-(x**2+y**2+z**2)/2)
> 
> #this reshapes the points into the kind of input LinearNDInterpolator
> wants: Npts x Ndims
> pts = array((x.ravel(),y.ravel(),z.ravel())).T
> 
> #and the values should be a 1d array that matches the first dimension
> of pts
> sr = s.ravel()
> 
> i = LinearNDInterpolator(pts,sr)
> 
> 
> Now to get values at whatever points you want, you call the
> interpolator with an array of dimensions nyourpoints x ndims.  e.g.
> 
> >>> i([[0,0,0]])
> array([ 1.])
> >>> i([[0,0,0],[0,1,0],[1,1,0],[0,0,.5]])
> array([ 1.        ,  0.60653066,  0.36787944,  0.87919328])
> 
> Although note that if you go off the grid, you get NaN back:
> >>> i([[0,0,2]])
> array([ nan])
> 

> 
> On Fri, Apr 22, 2011 at 10:27 AM, Jonathan Slavin
> <jslavin at cfa.harvard.edu> wrote:
> > Hi all,
> >
> > I'm wondering if anyone has used the routine
> > scipy.interpolate.LinearNDInterpolator
> > >From what I can tell, it should do fast multidimensional linear
> > interpolations, which is something I could use.  My problem is that
> it
> > isn't well documented.
> >
> > What I have is a 3-D grid of data values and what I want is values
> at a
> > specific group of non-gridded points.  scipy.interpolate.griddata
> seems
> > to do the opposite to what I want -- given a set of (non-gridded)
> points
> > at which you know the data value, interpolate onto a regular grid.
>  It
> > seemed like LinearNDInterpolator was what I wanted, but it seems to
> want
> > the same input as griddata -- points at which the data value is
> known.
> > That is, it takes two inputs points and values where the number of
> > points must match the no. of values.  What I need is something more
> like
> > linearinterp(gridded_data, coords) -- that is, more like what
> > scipy.ndimage.map_coordinates does, but much faster and just linear
> > (rather than spline) interpolation.  I wrote a routine that does
> this,
> > and reasonably quickly, but it's pure python and not as fast as I'd
> > like.
> >
> > Jon
> >
> > _______________________________________________
> > AstroPy mailing list
> > AstroPy at scipy.org
> > http://mail.scipy.org/mailman/listinfo/astropy
> >
> 
> 
> 
> -- 
> Erik Tollerud
> 




More information about the AstroPy mailing list