Python线性插值实现:numpy.interp与scipy.interpolate.interp1d详解

星野
星野
发布时间:2026-10-16| 6人浏览过
原创

本文详细介绍Python中实现线性插值的两种主要方法:numpy.interp与scipy.interpolate.interp1d。文章解析了各函数的关键参数,包括边界处理、周期设定及外插选项,并提供了完整的代码示例,展示如何根据已知数据序列估算未知点的数值,适用于一维数据插值场景。

线性插值

插值的定义是基于已知的数据序列(可视为坐标系中一系列离散的点),通过寻找数据间的规律,对尚未有数据记录的点进行数值估计。线性插值专门针对一维数据,它利用需要插值的点左右两侧相邻的两个已知数据点来进行估算。需要注意的是,线性插值并非简单取这两点数据的平均值(即使在该点位于中心时也不等于平均值),而是根据待求点到这两个已知点的距离来分配权重比例。

python实现线性插值

numpy.interp

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

参数说明如下:

  • x:类似数组格式,表示需要插值的点的横坐标。
  • xp:一维浮点数序列,代表数据点的x坐标。若未指定周期参数,xp必须递增;否则,在应用归一化周期边界后,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:字符串或整数,指定插值样条曲线的阶数。线性插值使用'linear'。其他可选值包括'nearest', 'nearest-up', 'zero', 'slinear', 'quadratic', 'cubic', 'previous', 'next'。其中'zero', 'slinear', 'quadratic', 'cubic'对应不同阶数的样条插值。
  • axis:int类型,指定沿哪个轴进行插值。
  • copy:bool类型,控制是否复制数据。
  • bounds_error:布尔值,决定越界时是否报错。除非设置fill_value='extrapolate',否则默认在越界时报错。
  • fill_value:数组或'extrapolate',指定x范围之外的填充值或方法。当设为'extrapolate'时,返回的函数会对落在x范围外的值进行外插处理。
  • assume_sorted:bool类型,假设x已排序以优化性能。

示例代码展示如下:

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

本文关于Python实现线性插值的介绍到此结束,更多相关Python线性插值内容可搜索本站以往文章或继续浏览后续相关文章,感谢大家的支持!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。