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

使用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)超出了原始数据的时间范围,同时存在一个潜在问题:

  1. 目标rangeTime被转为float64,但原始times如果仍为datetime64类型,两者数值基准不一致,会导致范围判断出错。
  2. 目标时间序列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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 17:28:41