[SciPy-User] 3D spline interpolation very, very slow - UPDATE -
Joe Kington
joferkington at gmail.com
Tue Sep 9 09:53:05 EDT 2014
The reason is because `ndimage.map_coordinates` pre-calculates a series of
weights on the entire input grid to reduce a higher-order interpolation
problem to linear interpolation. This is why linear 3D interpolation
(`order=1`) takes a fraction of a millisecond while your second-order
spline interpolation on the same dataset takes several seconds.
It's an optimization for the situation where you're interpolating many
(e.g. thousands) of points instead of a single point, as your example. In
a nutshell, `map_coordinates` isn't optimized for the use-case of
interpolating a small number of points.
If you were to compare an interpolation with several thousand points, the
timing should be similar.
However, the cost is a one-time cost. One way to get around it is to
pre-calculate the weights before-hand using `ndimage.spline_filter` and
then pass them in and specify `prefilter=False` to `map_coordinates.
Here's a quick modification of your original example:
https://gist.github.com/joferkington/cc2f4d9a3eb96d837ef1
At any rate, this is something that could certainly be more optimized for a
small number of points. It currently assumes you're interested in
interpolating over most of the input array and does a lot of (sometimes
unnecessary) legwork to optimize for that use-case. I'm not going to
volunteer, at the moment, though :)
(Also, on a side note, it's best to use odd-ordered splines. Otherwise you
won't have a "smooth" interpolation. I'd be willing to bet that your julia
example is effectively using `order=3`. Regardless, that doesn't have
anything to do with speed.)
Hope that helps,
-Joe
On Tue, Sep 9, 2014 at 5:06 AM, Uwe Fechner <u.fechner at tudelft.nl> wrote:
> Hello,
>
> I am trying to do a spline interpolation of a 3D wind field.
>
> For this I am using the function ndimage.map_coordinates.
>
> For some reasons this works well if I interpolate in one dimension,
> but it gets terrible slow if I do this in three dimensions.
>
> An example program can be found at:
> https://gist.github.com/anonymous/32c8599466dad30cd551
>
> Am I doing something wrong?
>
> I wrote a similar program, using the Julia programming language,
> at the speed is about 10000 times higher.
>
> This Julia program can be found at:
> https://gist.github.com/anonymous/70af96a6916b4906f2b0
>
> Any ideas how to improve the speed of the Python code are welcome.
>
> Best regards:
>
> Uwe Fechner
>
> ---------------------------------------------
> Uwe Fechner, M.Sc.
> Delft University of Technology
> Faculty of Aerospace Engineering/ Wind Energy
> Kluyverweg 1,
> 2629 HS Delft, The Netherlands
> Phone: +31-15-27-88902
>
> _______________________________________________
> SciPy-User mailing list
> SciPy-User at scipy.org
> http://mail.scipy.org/mailman/listinfo/scipy-user
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.scipy.org/pipermail/scipy-user/attachments/20140909/b2ff7a08/attachment.html>
More information about the SciPy-User
mailing list