使用scipy.interpn插值时出现维度0 xi越界的ValueError求助
问题:interpn插值触发"xi越界"错误
尝试将48×86的时间×高度风速网格插值为71×81的目标网格,使用scipy.interpolate.interpn时出现错误:
ValueError: One of the requested xi is out of bounds in dimension 0
原代码
目标插值网格
rangeTime = np.arange(np.datetime64('2018-05-30T00:20:00'),np.datetime64('2018-05-31T00:00:00'),np.timedelta64(20,'m')) rangeHeight = np.arange(200,4250,50) rangeTime = rangeTime.astype("float64") inTime, inHeight = np.meshgrid(rangeTime,rangeHeight,indexing='ij')
待插值数据
times= ds.time.values #1d time array heightvalues = ds.heights.values #48 x 86 grid with height data height1d = heightvalues[0,:] #only need 1st slice, so I get 1d array with all my heights. wspeed = ds.wspd.values #wind speed data, 48 x 86 grid
插值调用
grid_wspeed = interpn((times,height1d),wspeed,(inTime,inHeight), method = 'linear')
错误原因
这个错误明确说明目标网格的时间点(维度0)超出了原始数据的时间范围,同时存在一个潜在问题:
- 目标
rangeTime被转为float64,但原始times如果仍为datetime64类型,两者数值基准不一致,会导致范围判断出错。 - 目标时间序列
rangeTime的起止可能超出了原始times的最小/最大值。
解决方法
1. 统一时间数据类型
将原始times也转为float64,和目标网格保持一致的数值格式:
times= ds.time.values.astype("float64")
2. 验证并修正范围
先打印原始与目标的时间、高度范围,确认是否存在越界:
# 检查时间范围 print(f"原始时间范围: [{times.min()}, {times.max()}]") print(f"目标时间范围: [{rangeTime.min()}, {rangeTime.max()}]") # 检查高度范围 print(f"原始高度范围: [{height1d.min()}, {height1d.max()}]") print(f"目标高度范围: [{rangeHeight.min()}, {rangeHeight.max()}]")
如果目标范围超出原始范围,可选择两种处理方式:
- 截断目标范围:将超出部分裁剪到原始范围内
rangeTime = np.clip(rangeTime, times.min(), times.max()) rangeHeight = np.clip(rangeHeight, height1d.min(), height1d.max()) inTime, inHeight = np.meshgrid(rangeTime, rangeHeight, indexing='ij') - 允许越界并填充值:在
interpn中关闭边界检查,用指定值填充越界区域(比如np.nan)grid_wspeed = interpn( (times, height1d), wspeed, (inTime, inHeight), method='linear', bounds_error=False, fill_value=np.nan )
3. 完整修正后的代码
# 目标插值网格代码 rangeTime = np.arange(np.datetime64('2018-05-30T00:20:00'),np.datetime64('2018-05-31T00:00:00'),np.timedelta64(20,'m')) rangeHeight = np.arange(200,4250,50) rangeTime = rangeTime.astype("float64") # 待插值数据相关代码 times= ds.time.values.astype("float64") # 统一类型 heightvalues = ds.heights.values height1d = heightvalues[0,:] wspeed = ds.wspd.values # 可选:裁剪目标范围到原始数据范围内 rangeTime = np.clip(rangeTime, times.min(), times.max()) rangeHeight = np.clip(rangeHeight, height1d.min(), height1d.max()) inTime, inHeight = np.meshgrid(rangeTime, rangeHeight, indexing='ij') # 调用interpn grid_wspeed = interpn((times, height1d), wspeed, (inTime, inHeight), method='linear')
内容的提问来源于stack exchange,提问作者DLW9900
相关产品推荐
相关产品推荐

