python实现线性插值的示例

作者:初学小白Lu 时间:2023-08-10 21:33:55 

线性插值

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

python实现线性插值

numpy.interp

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

参数:

  • x:类似数组,要插值点的横坐标

  • xp:一维浮点数序列,如果未指定参数周期,则数据点的x坐标必须增加 . 否则,在用归一化周期边界之后对xp进行内部排序,xp = xp % period。

  • fp:一维浮点数或复数序列,数据点的y坐标,与xp的长度相同。

  • left:可选择参数。x <xp [0]的返回值,默认值为fp [0]。

  • 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])

示例:已知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)

scipy.interpolate.interp1d

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

参数:

  • x:数值数组。一般是升序排列的x数据点。

  • y:数值数组。与x数据点对应的y坐标,插值维的长度必须与x长度相同。

  • kind:字符串或整数,给出插值的样条曲线的阶数,线性插值用&rsquo;linear&rsquo;。&lsquo;linear&rsquo;, &lsquo;nearest&rsquo;, &lsquo;nearest-up&rsquo;, &lsquo;zero&rsquo;, &lsquo;slinear&rsquo;, &lsquo;quadratic&rsquo;, &lsquo;cubic&rsquo;, &lsquo;previous&rsquo;, or &lsquo;next&rsquo;. &lsquo;zero&rsquo;, &lsquo;slinear&rsquo;, &lsquo;quadratic&rsquo; ,&lsquo;cubic&rsquo;。

  • axis:int

  • copy:bool

  • bounds_error:布尔值,越界是否报错,除非fill_value=&lsquo;extrapolate&rsquo;,否则默认越界时报错。

  • fill_value:数组或&rsquo;extrapolate&rsquo;,指定不在x范围内时的填充值或填充方法. 当为&rsquo;extrapolate&rsquo;时,返回的函数会对落在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()

示例:

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])

来源:https://blog.csdn.net/weixin_43956958/article/details/128150723

标签:python,线性插值
0
投稿

猜你喜欢

  • Python深度优先算法生成迷宫

    2023-05-13 08:38:09
  • 详解Vue用自定义指令完成一个下拉菜单(select组件)

    2024-05-09 15:19:06
  • opencv中cv2.minAreaRect函数输出角度问题详解

    2023-09-08 06:38:47
  • js 混淆加密工具代码

    2007-09-22 18:10:00
  • 详解Python如何利用turtle绘制中国结

    2021-02-10 13:52:29
  • Django 如何使用日期时间选择器规范用户的时间输入示例代码详解

    2023-06-18 23:56:20
  • 仿豆瓣分页原型(Javascript版)

    2007-11-05 14:04:00
  • 不用Global.asa也能实现统计在线人数吗?

    2009-10-29 12:28:00
  • python实现决策树分类

    2021-04-04 13:35:28
  • Python pandas 列转行操作详解(类似hive中explode方法)

    2021-02-18 15:12:31
  • Python实现随机生成手机号及正则验证手机号的方法

    2021-05-30 01:41:27
  • 从零学python系列之从文件读取和保存数据

    2021-02-11 01:51:29
  • 深入了解Django View(视图系统)

    2022-07-18 14:47:13
  • Oracle数据库安全策略分析(一)

    2010-07-31 12:57:00
  • Python实现一个简单的毕业生信息管理系统的示例代码

    2023-12-20 04:40:46
  • 关于Internet Explorer 8

    2009-03-22 15:40:00
  • Python实现批量识别银行卡号码以及自动写入Excel表格步骤详解

    2023-12-12 21:39:18
  • sql2005 日志清理 SQL2005压缩清除日志的方法

    2024-01-28 12:59:25
  • sql中的 IF 条件语句的用法详解

    2024-01-17 12:37:12
  • asp如何用ADO批量更新记录?

    2010-06-10 18:42:00
  • asp之家 网络编程 m.aspxhome.com