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

为何RegularGridInterpolator无法返回R^d维度的函数输出值?

关于RegularGridInterpolator多输出插值的问题

最小可复现示例(含可行与不可行输出)

import numpy as np
from scipy.interpolate import RegularGridInterpolator, griddata

def f(x1, x2, x3):
    return x1 + 2*x2 + 3*x3, x1**2, x2

# 定义输入点序列
xi = [np.linspace(0, 1, 5), np.linspace(0, 1, 5), np.linspace(0, 1, 5)]

# 生成规则网格
x1, x2, x3 = np.meshgrid(*xi, indexing='ij')

# 计算多维度输出
y = f(x1, x2, x3)
assert (y[0][1][1][3] == (0.25 + 2*0.25 + 3*0.75))
assert (y[1][1][1][3] == (0.25**2))
assert (y[2][1][1][3] == 0.25)

#### 可行:仅插值单个输出维度
# 在(0.3, 0.3, 0.4)处插值第一个输出维度
interp = RegularGridInterpolator(xi, y[0])
print(interp([0.3, 0.3, 0.4]))  # 预期输出2.1,实际符合预期


#### 不可行:尝试同时插值所有输出维度
# 在(0.3, 0.3, 0.4)处插值全部输出维度
interp = RegularGridInterpolator(xi, y)
print(interp([0.3, 0.3, 0.4]))  # 未输出预期的array([2.1, 0.1, 0.3])

griddata的对比实现(支持多输出插值)

# griddata的多输出插值实现
grid_for_griddata = np.array([x1.flatten(), x2.flatten(), x3.flatten()]).T
assert (grid_for_griddata.shape == (125, 3))
y_for_griddata = np.array([y[0].flatten(), y[1].flatten(), y[2].flatten()]).T
assert (y_for_griddata.shape == (125, 3))
# 在(0.3, 0.3, 0.4)处插值
result = griddata(grid_for_griddata, y_for_griddata, [0.3, 0.3, 0.4], method='linear')[0]
print(result)  # 如预期输出array([2.1, 0.1, 0.3])

疑问

  • 是否错误使用了RegularGridInterpolator?
  • 已知griddata可实现需求,但由于数据是规则网格,理论上RegularGridInterpolator速度更快,应该优先使用它,对吗?

性能对比

性能对比图


内容的提问来源于stack exchange,提问作者FluidMechanics Potential Flows

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 04:05:54