Interpolation in SciPy: Finding X that produces Y Interpolation in SciPy: Finding X that produces Y numpy numpy

Interpolation in SciPy: Finding X that produces Y


The UnivariateSpline class in scipy makes doing splines much more pythonic.

x = [70, 80, 90, 100, 110]y = [49.7, 80.6, 122.5, 153.8, 163.0]f = interpolate.UnivariateSpline(x, y, s=0)xnew = np.arange(70,111,1)plt.plot(x,y,'x',xnew,f(xnew))

To find x at y then do:

yToFind = 140yreduced = np.array(y) - yToFindfreduced = interpolate.UnivariateSpline(x, yreduced, s=0)freduced.roots()

I thought interpolating x in terms of y might work but it takes a somewhat different route. It might be closer with more points.


If all you need is linear interpolation, you could use the interp function in numpy.


I may have misunderstood your question, if so I'm sorry. I don't think you need to use SciPy. NumPy has a least squares function.

#!/usr/bin/env pythonfrom numpy.linalg.linalg import lstsqdef find_coefficients(data, exponents):    X = tuple((tuple((pow(x,p) for p in exponents)) for (x,y) in data))    y = tuple(((y) for (x,y) in data))    x, resids, rank, s = lstsq(X,y)    return xif __name__ == "__main__":    data = tuple((        (1.47, 52.21),        (1.50, 53.12),        (1.52, 54.48),        (1.55, 55.84),        (1.57, 57.20),        (1.60, 58.57),        (1.63, 59.93),        (1.65, 61.29),        (1.68, 63.11),        (1.70, 64.47),        (1.73, 66.28),        (1.75, 68.10),        (1.78, 69.92),        (1.80, 72.19),        (1.83, 74.46)    ))    print find_coefficients(data, range(3))

This will return [ 128.81280358 -143.16202286 61.96032544].

>>> x=1.47 # the first of the input data>>> 128.81280358 + -143.16202286*x + 61.96032544*(x**2)52.254697219095988

0.04 out, not bad