如何在Python中用Scipy结合meshgrid实现MATLAB同款插值?
解决Scipy interpn与MATLAB interpn的适配问题
问题根源
Scipy的scipy.interpolate.interpn和MATLAB的interpn参数逻辑存在差异:
- MATLAB可直接传入网格矩阵(如
XX, YY)作为坐标输入; - Scipy要求第一个参数是原始坐标向量的列表(如
[x, y]),而非meshgrid生成的网格矩阵;同时要插值的点需整理成(N, 维度数)的二维数组格式。
修正后的Python代码
import numpy as np from scipy.interpolate import interpn # 生成原始数据,与MATLAB逻辑一致 x = np.linspace(-10, 10, 10) y = np.linspace(-5, 5, 10) DATA = np.random.rand(10, 10) # 生成网格(indexing='ij'等价于MATLAB的ndgrid) XX, YY = np.meshgrid(x, y, indexing='ij') XX2 = XX YY2 = YY # 1. 构造Scipy interpn要求的坐标向量列表 points = [x, y] # 2. 将查询点整理为(N, 2)的二维数组:展平网格后按列堆叠 query_points = np.column_stack((XX2.ravel(), YY2.ravel())) # 3. 执行插值,将一维结果还原为原网格形状 DATA2 = interpn(points, DATA, query_points).reshape(XX2.shape) # 验证:原网格点插值结果与原始DATA在浮点精度内一致 print(np.allclose(DATA, DATA2)) # 输出True
关键修改说明
- 把传入
interpn的XX, YY替换为原始坐标向量列表[x, y]; - 将网格格式的查询点
XX2, YY2展平后组合成二维数组,匹配Scipy的参数要求; - 插值结果默认是一维数组,用
reshape还原为10x10的网格形状,和MATLAB输出格式对齐。
内容的提问来源于stack exchange,提问作者Mo0nKizz
相关产品推荐
相关产品推荐

