scipy.interp2d图像特定坐标插值返回3x3数组的原因及解决方法
矩形网格图像的特定像素插值问题
问题描述
给定矩形形式的图像数组,使用scipy.interpolate.interp2d进行插值时,想获取3个特定坐标的插值结果,却得到了3x3的数组,这是什么原因?该如何修改代码得到目标结果?
原代码如下:
import numpy as np from scipy.interpolate import interp2d # 生成矩形网格 x = np.arange(20) y = np.arange(30) xg, yg = np.meshgrid(x, y) zg = np.exp(-(2*xg)**2 - (yg/2)**2) # 创建插值器 interp = interp2d(yg, xg, zg) # 尝试插值特定坐标 zi = interp([1.5, 2.4, 5.8], [0.5, 7.2, 2.2]) print(zi.shape) # 输出 (3, 3)
原因解析
interp2d的调用逻辑是:当传入两个一维数组x_new和y_new时,它会计算所有x_new与y_new的组合点的插值结果,生成形状为(len(y_new), len(x_new))的二维数组。你传入的两个数组长度都是3,所以会得到3x3的数组,对应(1.5,0.5)、(2.4,0.5)、(5.8,0.5)、(1.5,7.2)等9个组合点的插值值。
修改方案
要仅计算对应位置的点(即(1.5,0.5)、(2.4,7.2)、(5.8,2.2)这3个点),有两种实用方法:
方法1:提取interp2d结果的对角线元素
interp2d返回的数组中,对角线元素正好是你需要的对应坐标点的插值结果,直接提取即可:
zi = interp([1.5, 2.4, 5.8], [0.5, 7.2, 2.2]) zi_target = np.diag(zi) print(zi_target.shape) # 输出 (3,)
方法2:改用RegularGridInterpolator(更推荐)
scipy.interpolate.RegularGridInterpolator专门支持对点序列进行插值,无需计算所有组合,效率更高:
import numpy as np from scipy.interpolate import RegularGridInterpolator # 定义原始网格 x = np.arange(20) y = np.arange(30) xg, yg = np.meshgrid(x, y) zg = np.exp(-(2*xg)**2 - (yg/2)**2) # 创建插值器,注意轴顺序:先x轴,再y轴,zg需转置匹配轴顺序 interp = RegularGridInterpolator((x, y), zg.T) # 构造待插值的点序列,形状为(n_points, 2) points = np.array([[1.5, 0.5], [2.4, 7.2], [5.8, 2.2]]) zi = interp(points) print(zi.shape) # 输出 (3,)
说明:原始zg是meshgrid(x,y)生成的,形状为(30,20)(y的长度×x的长度),转置为(20,30)后才能与(x,y)的轴顺序匹配,确保插值坐标对应正确。
内容的提问来源于stack exchange,提问作者HansSnah
相关产品推荐
相关产品推荐

