You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 20:40:31