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

scipy.interpn参数输入格式困惑及ValueError报错求助

scipy.interpolate.interpn 参数格式说明与报错解决

一、interpn核心参数格式要求

  • points:元组类型,每个元素是对应维度的所有采样点构成的一维数组。比如3维场景下,格式为(x_array, y_array, z_array),其中x_array是x轴上所有采样点的集合,y_array、z_array同理,每个数组需保持单调(官方要求)。
  • values:N维数组,维度数量必须与points的长度一致,且每个维度的长度需匹配points中对应维度数组的长度。例如points是(x(5个点), y(6个点), z(7个点)),则values必须是(5,6,7)形状的数组,每个位置对应(x[i], y[j], z[k])的函数值。

二、报错原因与解决方案

报错原因

你传入的test_coords和test_density完全不符合参数要求:

  1. test_coords是3个完整采样点的坐标(每行是一个(x,y,z)),但points需要的是每个维度单独的采样点数组,而非单个采样点的集合;
  2. test_density是1维数组,但test_coords被interpn识别为3个维度的点数组(因它是3行的二维数组,interpn会把每行当作一个维度的数组),导致维度不匹配,触发There are 3 point arrays, but values has 1 dimensions错误。

另外,你的原始数据仅包含一条直线上的点(y固定为0.4,z固定为-15.6,只有x变化),无法直接进行3维插值,只能针对x维度做1维插值,或补充y、z维度的采样点构建完整3维网格后再插值。

解决方案

方案1:针对x维度做1维插值(匹配原始数据)

如果只需要在x维度插值,且y、z使用固定值(和原始数据一致),可以这样修改:

import numpy as np
from scipy.interpolate import interpn

# 拆分原始数据到各维度
x_values = test_coords[:, 0]
fixed_y = test_coords[0, 1]
fixed_z = test_coords[0, 2]
values = test_density

# 要插值的点:x=1,y和z用固定值
xi = np.array([[1, fixed_y, fixed_z]])
# 调用interpn,points是(x_values,),对应1维插值
result = interpn((x_values,), values, xi, bounds_error=False)
print(result)

方案2:补充数据构建3维网格(如需真正的3维插值)

如果确实需要3维插值,你需要补充y、z维度的采样点,构建完整的3维坐标网格,并生成对应每个网格点的密度值,示例如下:

import numpy as np
from scipy.interpolate import interpn

# 补充y和z的采样点
x = np.array([0.4, 1.2, 2.0])
y = np.array([0.4, 1.0])  # 新增y维度采样点
z = np.array([-15.6, 1.0])  # 新增z维度采样点
points = (x, y, z)

# 构建3维网格的密度值(需替换为真实数据)
values = np.random.rand(len(x), len(y), len(z))

# 插值点
xi = np.array([1, 1, 1])
result = interpn(points, values, xi)
print(result)

内容的提问来源于stack exchange,提问作者adawg

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 02:27:03