scipy.interp2d已弃用,如何实现二维网格插值?
替代scipy.interp2d实现二维规则网格插值的简便方案
问题背景
我需要对二维pandas规则网格进行插值,原流程为:提取DataFrame的索引与列作为坐标,将数据转换为numpy数组后,使用scipy.interp2d(x_index,y_index,my2Ddata)定义插值函数,调用f(a,b)获取结果。但scipy.interp2d已弃用,需寻找替代方案。
官方报错提示
对于遗留代码,规则网格可使用RectBivariateSpline替代,散乱二维数据可使用bisplrep/bisplev;新代码中,规则网格建议使用RegularGridInterpolator,散乱数据优先选择LinearNDInterpolator或CloughTocher2DInterpolator。
最优解决方案:使用RegularGridInterpolator
针对规则网格场景,RegularGridInterpolator是官方推荐的新方案,用法简洁且性能更优,完全适配需求,具体步骤如下:
1. 导入依赖模块
import numpy as np from scipy.interpolate import RegularGridInterpolator import pandas as pd
2. 处理数据(从pandas转换为numpy)
假设数据存储在df(pandas DataFrame)中:
# 提取x、y方向的坐标(列对应x,索引对应y) x_coords = df.columns.values # 一维numpy数组,x轴坐标 y_coords = df.index.values # 一维numpy数组,y轴坐标 grid_data = df.values # 二维numpy数组,对应网格上的原始数据
3. 创建插值器
注意坐标顺序与数据数组的轴顺序对应:grid_data的形状为(len(y_coords), len(x_coords)),因此插值器的坐标参数需传入(y_coords, x_coords):
interpolator = RegularGridInterpolator((y_coords, x_coords), grid_data)
4. 执行插值
- 单个点插值:传入二维数组格式的坐标对(每行一个点),提取结果标量:
# 假设要插值的点为(y=a, x=b) single_point_result = interpolator(np.array([[a, b]]))[0]
- 批量点/网格插值:若需生成新的插值网格,可先构造网格点再传入:
# 构造新的x、y坐标数组 x_new = np.linspace(x_coords.min(), x_coords.max(), 100) y_new = np.linspace(y_coords.min(), y_coords.max(), 100) # 生成网格点矩阵 y_grid, x_grid = np.meshgrid(y_new, x_new, indexing='ij') # 转换为插值器要求的点格式(N个点的二维数组) points = np.stack([y_grid.ravel(), x_grid.ravel()], axis=1) # 执行插值并重塑为网格形状 interpolated_grid = interpolator(points).reshape(y_grid.shape)
5. 兼容原interp2d调用风格(可选)
如果习惯原interp2d的调用方式,可以封装一个简易函数:
def regular_grid_interp(x, y, data): interp = RegularGridInterpolator((y, x), data) y_grid, x_grid = np.meshgrid(y, x, indexing='ij') points = np.stack([y_grid.ravel(), x_grid.ravel()], axis=1) return interp(points).reshape(y_grid.shape) # 使用方式与原interp2d一致 f = lambda a, b: regular_grid_interp(a, b, grid_data) # 传入新的x、y坐标数组,得到插值后的二维数组 result = f(x_new, y_new)
内容的提问来源于stack exchange,提问作者M LUY
相关产品推荐
相关产品推荐

