SciPy插值学习笔记
什么是插值?
插值是指通过已知数据点得到新的数据点的过程,即在已知数据点间“填补空白”以获得更为平滑的近似曲线。在科学计算中,插值通常用于对实验数据进行光滑处理或重构函数。
SciPy的插值模块简介
SciPy库提供了许多插值技术,包括线性插值、样条插值和克里金插值等。以下将介绍其中几种常见的插值方法。
线性插值
在已知的数据点间使用线性函数进行插值。
pythonCopy Codefrom 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 Codefrom 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 Codefrom 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中常见的插值方法——线性插值、样条插值和克里金插值,并通过具体例子加以演示。读者可以根据需要选择不同的插值方法进行数据处理。