Spline Interpolation with Python

前端 未结 3 1987
醉酒成梦
醉酒成梦 2020-12-15 08:37

I wrote the following code to perform a spline interpolation:

import numpy as np
import scipy as sp

x1 = [1., 0.88,  0.67,  0.50,  0.35,  0.27, 0.18,  0.11,         


        
相关标签:
3条回答
  • 2020-12-15 08:53

    You can get this in the following way:

    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)
    
    0 讨论(0)
  • 2020-12-15 09:03

    I've just got the above error and fixed it with remove duplicated value in the X and Y array.

    x = np.sort(np.array([0, .2, .2, .4, .6, .9]))
    y = np.sort(np.sort(np.array([0, .1, .06, .11, .25, .55]))
    

    ⬇ Change 0.2 to 0.3 or any number.

    x = np.sort(np.array([0, .2, .3, .4, .6, .9]))
    y = np.sort(np.sort(np.array([0, .1, .06, .11, .25, .55]))
    
    0 讨论(0)
  • 2020-12-15 09:05

    From the scipy documentation on scipy.interpolate.interp1d:

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

    x : array_like. A 1-D array of monotonically increasing real values.

    ...

    The problem is that the x values are not monotonically increasing. In fact they are monotonically decreasing. Let me know if this works and if its still the computation you are looking for.:

    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)
    
    0 讨论(0)
提交回复
热议问题