Python插值方法

发布时间:2026/5/30 13:10:15

Python插值方法 # Python插值方法 - 完整代码示例# 插值通过已知数据点构造连续函数广泛应用于数据平滑和缺失值填充import numpy as npimport matplotlib.pyplot as pltfrom scipy import interpolatefrom scipy.interpolate import Rbf# 1. 一维插值interp1d线性插值和三次样条插值# 生成稀疏的已知数据点x_sparse np.linspace(0, 10, 11) # 只有 11 个点y_sparse np.sin(x_sparse) * np.exp(-x_sparse / 5)# 密集查询点用于插值评估x_dense np.linspace(0, 10, 200)# 线性插值f_linear interpolate.interp1d(x_sparse, y_sparse, kindlinear)y_linear f_linear(x_dense)# 三次样条插值平滑性更好f_cubic interpolate.interp1d(x_sparse, y_sparse, kindcubic)y_cubic f_cubic(x_dense)# 在已知点处的插值误差print(一维插值评估:)print(f线性插值在 x2.5 处: {f_linear(2.5):.6f})print(f三次插值在 x2.5 处: {f_cubic(2.5):.6f})print(f真实值 sin(2.5)*e^(-0.5): {np.sin(2.5)*np.exp(-2.5/5):.6f})# 2. CubicSpline 三次样条插值更丰富的边界条件控制# 自然样条二阶导数为零和 clamped 样条指定一阶导数cs_natural interpolate.CubicSpline(x_sparse, y_sparse, bc_typenatural)cs_clamped interpolate.CubicSpline(x_sparse, y_sparse, bc_typeclamped)y_natural cs_natural(x_dense)y_clamped cs_clamped(x_dense)print(f\nCubicSpline 自然边界在 x5: {cs_natural(5):.6f})print(fCubicSpline clamped 在 x5: {cs_clamped(5):.6f})# 3. UnivariateSpline 平滑样条带平滑参数 s# 当数据有噪声时s 参数控制平滑程度np.random.seed(123)x_noisy np.linspace(0, 10, 30)y_true np.sin(x_noisy) * np.exp(-x_noisy / 5)y_noisy y_true 0.05 * np.random.randn(30)# s 是平滑因子s0 精确插值s 越大越平滑spl_smooth interpolate.UnivariateSpline(x_noisy, y_noisy, s0.5)spl_accurate interpolate.UnivariateSpline(x_noisy, y_noisy, s0)y_smooth spl_smooth(x_dense)print(f\n平滑样条评估:)print(f平滑参数 s0.5 在 x3: {spl_smooth(3):.6f})print(f精确插值 s0 在 x3: {spl_accurate(3):.6f})print(f真实值: {np.sin(3)*np.exp(-3/5):.6f})# 4. 外推Extrapolationinterp1d 默认不支持外推# 使用 fill_value 或 bounds_errorFalse 控制外推行为f_extrap interpolate.interp1d(x_sparse, y_sparse, kindcubic,fill_valueextrapolate)val_extrap f_extrap(12) # 超出 [0,10] 范围print(f\n外推值 x12: {val_extrap:.6f})# 5. 二维插值griddata# 在二维散点数据上进行插值支持多种方法np.random.seed(42)n_pts 100x_2d np.random.uniform(-2, 2, n_pts)y_2d np.random.uniform(-2, 2, n_pts)z_2d x_2d * np.exp(-x_2d**2 - y_2d**2) # 真实函数# 创建网格用于查询xi np.linspace(-2, 2, 50)yi np.linspace(-2, 2, 50)XI, YI np.meshgrid(xi, yi)# 使用不同的二维插值方法z_linear interpolate.griddata((x_2d, y_2d), z_2d, (XI, YI), methodlinear)z_cubic interpolate.griddata((x_2d, y_2d), z_2d, (XI, YI), methodcubic)z_nearest interpolate.griddata((x_2d, y_2d), z_2d, (XI, YI), methodnearest)print(f\n二维插值评估 (x0, y0):)print(f线性方法: {z_linear[25, 25]:.6f})print(f三次方法: {z_cubic[25, 25]:.6f})print(f最近邻方法: {z_nearest[25, 25]:.6f})print(f真实值: {0:.6f})# 6. 径向基函数插值 Rbf适用于散乱数据# Rbf 使用径向对称函数进行插值对高维散乱数据效果好rbf_linear Rbf(x_2d, y_2d, z_2d, functionlinear)rbf_gaussian Rbf(x_2d, y_2d, z_2d, functiongaussian, epsilon0.5)# 在 (0.5, 0.5) 点处评估 Rbf 插值query_pt np.array([[0.5], [0.5]])z_rbf_l rbf_linear(0.5, 0.5)z_rbf_g rbf_gaussian(0.5, 0.5)z_true_pt 0.5 * np.exp(-0.5**2 - 0.5**2)print(f\nRbf 插值评估 (x0.5, y0.5):)print(f线性 Rbf: {z_rbf_l:.6f})print(f高斯 Rbf: {z_rbf_g:.6f})print(f真实值: {z_true_pt:.6f})# 7. 样条插值的导数计算# CubicSpline 可以同时计算插值和导数x_pts np.array([0, 1, 2, 3, 4, 5])y_pts np.array([0, 0.5, 1.8, 3.2, 4.5, 6.0])cs interpolate.CubicSpline(x_pts, y_pts)# 一阶和二阶导数x_check 2.5print(f\n样条导数值 (x{x_check}):)print(f函数值: {cs(x_check):.4f})print(f一阶导: {cs(x_check, nu1):.4f})print(f二阶导: {cs(x_check, nu2):.4f})# 8. 插值在缺失值填充中的应用data_with_gaps np.array([1.0, 2.1, np.nan, 4.2, np.nan, 6.3, 7.1, 8.0])valid_idx ~np.isnan(data_with_gaps)valid_x np.where(valid_idx)[0]valid_y data_with_gaps[valid_idx]# 插值填充缺失值f_fill interpolate.interp1d(valid_x, valid_y, kindlinear)filled_x np.where(~valid_idx)[0]filled_y f_fill(filled_x)print(f\n缺失值填充: {filled_y})print(\n插值方法总结根据数据特征选择合适的方法)print(噪声数据用平滑样条精确数据用三次样条高维散乱数据用 Rbf)

相关新闻