SciPy插值学习笔记

什么是插值?

插值是指通过已知数据点得到新的数据点的过程,即在已知数据点间“填补空白”以获得更为平滑的近似曲线。在科学计算中,插值通常用于对实验数据进行光滑处理或重构函数。

SciPy的插值模块简介

SciPy库提供了许多插值技术,包括线性插值、样条插值和克里金插值等。以下将介绍其中几种常见的插值方法。

线性插值

在已知的数据点间使用线性函数进行插值。

pythonCopy Code
from scipy.interpolate import interp1d import matplotlib.pyplot as plt import numpy as np x = np.linspace(0, 10, num=11) y = np.cos(-x**2/9.0) f = interp1d(x, y) xnew = np.linspace(0, 10, num=41) ynew = f(xnew) plt.plot(x, y, 'o', xnew, ynew, '-') plt.show()

以上代码生成了一个以余弦函数为例的线性插值图。

样条插值

通过使用多项式函数连接相邻数据点来创造平滑的插值函数。

pythonCopy Code
from scipy.interpolate import interp1d, UnivariateSpline import matplotlib.pyplot as plt import numpy as np x = np.linspace(-3, 3, 50) y = np.exp(-x**2) + 0.1 * np.random.randn(50) f = interp1d(x, y, kind='cubic') spl = UnivariateSpline(x, y) xnew = np.linspace(-3, 3, 1000) plt.plot(x, y, 'o', xnew, f(xnew), '-', xnew, spl(xnew), '--') plt.legend(['data', 'cubic', 'spline'], loc='best') plt.show()

以上代码生成了一个以高斯函数噪声为例的样条插值图。

克里金插值

通过使用基于变差函数的统计算法来创建由离散数据物理模型。克里金插值由于是一种局部方法,因此通常用于对较小数据集进行插值处理。

pythonCopy Code
from scipy.interpolate import Rbf import numpy as np import matplotlib.pyplot as plt # Sample irregularly spaced data points n = 30 x, y, z = np.random.rand(n)*4 - 2, np.random.rand(n)*4 - 2, np.zeros(n) for i in range(n): z[i] = np.sin(x[i]**2 + y[i]**2) # Create a regular grid to interpolate the data. xi, yi = np.linspace(-2.1, 2.1, 100), np.linspace(-2.1, 2.1, 100) xi, yi = np.meshgrid(xi, yi) # Interpolate using radial basis functions rbf = Rbf(x, y, z, function='thin_plate') zi = rbf(xi, yi) # Plot the results fig, ax = plt.subplots(subplot_kw={"projection": "3d"}) ax.scatter(x, y, z, c='b') surf = ax.plot_surface(xi, yi, zi, cmap='coolwarm', linewidth=0, antialiased=False, alpha=0.5) plt.show()

以上代码生成了一个以三维正弦函数为例的克里金插值图。

结尾

本文介绍了SciPy中常见的插值方法——线性插值、样条插值和克里金插值,并通过具体例子加以演示。读者可以根据需要选择不同的插值方法进行数据处理。