• python实现线性插值


    线性插值

    插值:是根据已知的数据序列(可以理解为你坐标中一系列离散的点),找到其中的规律,然后根据找到的这个规律,来对其中尚未有数据记录的点进行数值估计。
    线性插值:是针对一维数据的插值方法。它根据一维数据序列中需要插值的点的左右临近两个数据来进行数值估计。当然了它不是求这两个点数据大小的平均值(在中心点的时候就等于平均值)。而是根据到这两个点的距离来分配比重的。

    python实现线性插值

    numpy.interp

    numpy.interp(x, xp, fp, left=None, right=None, period=None)
    
    • 1

    参数:

    • x:类似数组,要插值点的横坐标
    • xp:一维浮点数序列,如果未指定参数周期,则数据点的x坐标必须增加 . 否则,在用归一化周期边界之后对xp进行内部排序,xp = xp % period。
    • fp:一维浮点数或复数序列,数据点的y坐标,与xp的长度相同。
    • left:可选择参数。x
    • right:可选择参数。x> xp [-1]的返回值,默认值为fp [-1]。
    • period:设定横坐标的周期,该选项打开时,则忽略left和right。

    示例:

    import numpy as np 
    import matplotlib.pyplot as plt
    
    xp = [1, 2, 3]
    fp = [3, 2, 0]
    y = np.interp(2.5, xp, fp)
    #1.0
    
    y = np.interp([0, 1, 1.5, 2.72, 3.14], xp, fp)
    #array([3.  , 3.  , 2.5 , 0.56, 0.  ])
    
    UNDEF = -99.0
    y = np.interp(3.14, xp, fp, right=UNDEF)
    #-99.0
    
    #sine 函数插值
    x = np.linspace(0, 2*np.pi, 10)
    y = np.sin(x)
    xvals = np.linspace(0, 2*np.pi, 50)
    yinterp = np.interp(xvals, x, y)
    
    plt.plot(x, y, 'o')
    plt.plot(xvals, yinterp, '-x')
    plt.show()
    
    #周期 x 坐标的插值
    x = [-180, -170, -185, 185, -10, -5, 0, 365]
    xp = [190, -190, 350, -350]
    fp = [5, 10, 3, 4]
    y = np.interp(x, xp, fp, period=360)
    #array([7.5 , 5.  , 8.75, 6.25, 3.  , 3.25, 3.5 , 3.75])
    
    #复数插值Complex interpolation:
    x = [1.5, 4.0]
    xp = [2,3,5]
    fp = [1.0j, 0, 2+3j]
    y = np.interp(x, xp, fp)
    #array([0.+1.j , 1.+1.5j])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    示例:已知y坐标,求x点。

    import numpy as np
    
    y = np.array([0, 38.39, 71.41, 99.66, 123.67, 143.88, 160.61, 174.03, 184.16, 190.8, 193.52])
    x = np.array([0, 0.37, 0.74, 1.11, 1.48, 1.85, 2.22, 2.59, 2.96, 3.33, 3.7])
    plt.plot(x, y, '-')
    
    y_val = 30
    root = np.interp(y_val, y, x)
    print(root)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    scipy.interpolate.interp1d

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

    参数:

    • x:数值数组。一般是升序排列的x数据点。
    • y:数值数组。与x数据点对应的y坐标,插值维的长度必须与x长度相同。
    • kind:字符串或整数,给出插值的样条曲线的阶数,线性插值用’linear’。‘linear’, ‘nearest’, ‘nearest-up’, ‘zero’, ‘slinear’, ‘quadratic’, ‘cubic’, ‘previous’, or ‘next’. ‘zero’, ‘slinear’, ‘quadratic’ ,‘cubic’。
    • axis:int
    • copy:bool
    • bounds_error:布尔值,越界是否报错,除非fill_value=‘extrapolate’,否则默认越界时报错。
    • fill_value:数组或’extrapolate’,指定不在x范围内时的填充值或填充方法. 当为’extrapolate’时,返回的函数会对落在x范围外的值进行外插。
    • assume_sorted:bool

    示例:

    x = data['时间']
    y = data['浓度']
    # 构建完整的时间序列 = [1,23,...23]
    xnew = np.linspace(1,23,num=23)
    
    # 线性插值
    f1 = interp1d(x,y,kind='linear')
    ynew1 = f1(xnew)
    plt.scatter(x,y,zorder=3)
    plt.plot(xnew,ynew1,marker='s',ls='--',c='C1')
    plt.legend(['data','线性插值'])
    plt.xticks(range(0,24,1))
    plt.grid(ls='--',alpha=0.5)
    plt.xlabel('A')
    plt.ylabel('B')
    plt.tight_layout()
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    示例:

    from scipy.interpolate import interp1d
    
    x = [1, 2, 3]
    y = [3, 2, 0]
    f = interp1d(x,y,fill_value=(3,0),bounds_error=False) # 线性内插
    out = f([0, 1, 1.5, 2.72, 3.14])
    print(out)
    #array([3. , 3. , 2.5 , 0.56, 0. ])
    
    fe = interp1d(x,y, fill_value='extrapolate') # 线性内插+外插
    out = fe([0, 1, 1.5, 2.72, 3.14])
    print(out)
    #array([ 4. , 3. , 2.5 , 0.56, -0.28])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
  • 相关阅读:
    “一老一幼”的智慧化守护,网易和中国电信交出“三年答卷”
    【开源】基于Vue和SpringBoot的生活废品回收系统
    免息配资天宇优配|世界杯与A股有何关系?券商这样分析!
    MySQL和Oracle的区别有什么
    SFI立昌STD系列方案与应用
    国产数据库兼容性认证再下两城,极狐GitLab 国产适配更进一步
    李超线段树
    starrocks
    mysql 怎么做定时备份 / mysql 备份 / sql文件导出
    VSCode打开 C(嵌入式) 工程的一些记录
  • 原文地址:https://blog.csdn.net/weixin_43956958/article/details/128150723