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完全不符合参数要求:
test_coords是3个完整采样点的坐标(每行是一个(x,y,z)),但points需要的是每个维度单独的采样点数组,而非单个采样点的集合;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
相关产品推荐
相关产品推荐

