Your X
values are reversed, scipy.interpolate.spline
requires the independent variable to be monotonically increasing, and this method is deprecated - use interp1d
instead (see below).
>>> from scipy.interpolate import spline
>>> import numpy as np
>>> X = [736176.0, 736175.0, 736174.0] # <-- your original X is decreasing
>>> Y = [711.74, 730.0, 698.0]
>>> Xsmooth = np.linspace(736174.0, 736176.0, 10)
>>> spline(X, Y, Xsmooth)
array([ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
reverse X
and Y
first and it works
>>> spline(
... list(reversed(X)), # <-- reverse order of X so also
... list(reversed(Y)), # <-- reverse order of Y to match
... Xsmooth
... )
array([ 698. , 262.18297973, 159.33767533, 293.62017489,
569.18656683, 890.19293934, 1160.79538066, 1285.149979 ,
1167.41282274, 711.74 ])
Note that many spline interpolation methods require X
to be monotonically increasing:
x
: (N,) array_like - 1-D array of independent input data. Must be increasing.
x
: (N,) array_like - Input dimension of data points – must be increasing
The default order of scipy.interpolate.spline
is cubic. Because there are only 3 data points there are large differences between a cubic spline (order=3
) and a quadratic spline (order=2
). The plot below shows the difference between different order splines; note: 100 points were used to smooth the fitted curve more.

The documentation for scipy.interpolate.spline
is vague and suggests it may not be supported. For example, it is not listed on the scipy.interpolate
main page or on the interploation tutorial. The source for spline
shows that it actually calls spleval
and splmake
which are listed under Additional Tools as:
Functions existing for backward compatibility (should not be used in new code).
I would follow cricket_007's suggestion and use interp1d
. It is the currently suggested method, it is very well documented with detailed examples in both the tutorial and API, and it allows the independent variable to be unsorted (any order) by default (see assume_sorted
argument in API).
>>> from scipy.interpolate import interp1d
>>> f = interp1d(X, Y, kind='quadratic')
>>> f(Xsmooth)
array([ 711.74 , 720.14123457, 726.06049383, 729.49777778,
730.45308642, 728.92641975, 724.91777778, 718.4271605 ,
709.4545679 , 698. ])
Also it will raise an error if the data is rank deficient.
>>> f = interp1d(X, Y, kind='cubic')
ValueError: x and y arrays must have at least 4 entries