Interpolación Spline Con Python

Escribí el siguiente código para realizar una interpolación spline:

import numpy as np import scipy as sp x1 = [1., 0.88, 0.67, 0.50, 0.35, 0.27, 0.18, 0.11, 0.08, 0.04, 0.04, 0.02] y1 = [0., 13.99, 27.99, 41.98, 55.98, 69.97, 83.97, 97.97, 111.96, 125.96, 139.95, 153.95] x = np.array(x1) y = np.array(y1) new_length = 25 new_x = np.linspace(x.min(), x.max(), new_length) new_y = sp.interpolate.interp1d(x, y, kind='cubic')(new_x) 

pero estoy recibiendo:

 ValueError: A value in x_new is below the interpolation range. 

en interpolate.py

Cualquier ayuda sería apreciada.

De la documentación de scipy en scipy.interpolate.interp1d :

scipy.interpolate.interp1d (x, y, kind = ‘linear’, axis = -1, copy = True, lines_error = True, fill_value = np.nan)

x: array_like. Un conjunto 1-D de valores reales monótonamente crecientes.

El problema es que los valores de x no aumentan monotónicamente . De hecho están disminuyendo monótonamente. Déjeme saber si esto funciona y si sigue siendo el cálculo que está buscando:

 import numpy as np import scipy as sp from scipy.interpolate import interp1d x1 = sorted([1., 0.88, 0.67, 0.50, 0.35, 0.27, 0.18, 0.11, 0.08, 0.04, 0.04, 0.02]) y1 = [0., 13.99, 27.99, 41.98, 55.98, 69.97, 83.97, 97.97, 111.96, 125.96, 139.95, 153.95] new_length = 25 new_x = np.linspace(x.min(), x.max(), new_length) new_y = sp.interpolate.interp1d(x, y, kind='cubic')(new_x) 

Puedes obtener esto de la siguiente manera:

 import numpy as np import scipy as sp from scipy.interpolate import interp1d x1 = [1., 0.88, 0.67, 0.50, 0.35, 0.27, 0.18, 0.11, 0.08, 0.04, 0.04, 0.02] y1 = [0., 13.99, 27.99, 41.98, 55.98, 69.97, 83.97, 97.97, 111.96, 125.96, 139.95, 153.95] # Combine lists into list of tuples points = zip(x1, y1) # Sort list of tuples by x-value points = sorted(points, key=lambda point: point[0]) # Split list of tuples into two list of x values any y values x1, y1 = zip(*points) new_length = 25 new_x = np.linspace(min(x1), max(x1), new_length) new_y = sp.interpolate.interp1d(x1, y1, kind='cubic')(new_x)