如何正确使用scipy.interpolate的RegularGridInterpolator并修复维度报错
报错含义说明
你收到的报错是RegularGridInterpolator接口的输入维度不匹配导致的:你传入了3组坐标数组(对应x、y、z三个维度的网格轴),但对应的数值数组TD_temperatures只有1维,不符合该工具的输入要求。
根本原因
RegularGridInterpolator是专门为规则正交网格设计的插值工具,要求输入满足:
- 第一个参数为各维度的轴坐标,比如3维插值就传入(x轴所有唯一取值、y轴所有唯一取值、z轴所有唯一取值)
- 第二个参数的数值数组维度必须和插值维度匹配,3维插值要求数值数组形状为
(x轴长度, y轴长度, z轴长度)的3维数组,每个位置的取值对应网格交点的数值
你当前的坐标和温度都是长度为15的1维数组,本质是15个离散散点数据,每个坐标(x_i, y_i, z_i)对应一个温度值,同时所有z坐标固定为0.25,实际是2维平面上的散点,完全不符合规则网格的输入要求。
解决办法
根据你的数据特征,推荐两种可行方案:
方案1:改用散点插值工具griddata(更简单,优先推荐)
对于散点数据直接使用scipy提供的散点插值接口即可,示例代码如下:
import numpy as np from scipy.interpolate import griddata # 整理散点坐标为(n_samples, 2)格式,因z固定为0.25可省略 points = np.column_stack((TD_x_coordinates, TD_y_coordinates)) values = np.array(TD_temperatures) # 示例:插值x=0.05、y=0.04位置的温度 target_point = np.array([0.05, 0.04]) # 可选插值方法:'nearest'最近邻、'linear'线性、'cubic'三次插值 interpolated_temp = griddata(points, values, target_point, method='linear') print(interpolated_temp)
如果后续你补充了其他z值的散点,只需将points扩展为3维坐标即可。
方案2:将散点转为规则网格后使用RegularGridInterpolator
如果你确实需要使用该接口,需要先将散点数据整理为规则网格格式,示例代码如下:
import numpy as np from scipy.interpolate import RegularGridInterpolator # 对x、y坐标去重排序生成网格轴,z只有一个取值0.25 x_axis = np.sort(np.unique(TD_x_coordinates)) y_axis = np.sort(np.unique(TD_y_coordinates)) z_axis = np.array([0.25]) # 初始化符合维度要求的3维温度数组 temp_grid = np.full((len(x_axis), len(y_axis), len(z_axis)), np.nan) # 将现有散点的温度值填充到网格对应位置 for x, y, z, t in zip(TD_x_coordinates, TD_y_coordinates, TD_z_coordinates, TD_temperatures): x_idx = np.where(x_axis == x)[0][0] y_idx = np.where(y_axis == y)[0][0] z_idx = np.where(z_axis == z)[0][0] temp_grid[x_idx, y_idx, z_idx] = t # 初始化插值器 interpolation_function = RegularGridInterpolator((x_axis, y_axis, z_axis), temp_grid) # 测试插值 print(interpolation_function([0.05, 0.04, 0.25]))
注意:你的当前散点刚好是x、y的唯一取值一一对应,不会出现空值,如果是普通散点转网格会存在空值需要额外补全,这种场景下优先使用方案1。
内容的提问来源于stack exchange,提问作者Jacob Benny
相关产品推荐
相关产品推荐

