如何对数组值类型数据执行NumPy插值?报ValueError错误
解决np.interp处理多维y数组的报错问题
报错原因
np.interp 默认仅支持一维的yp输入,当yp是二维数组(如示例中(3,4)的形状)时,函数无法正确解析多维结构,因此抛出ValueError: object too deep for desired array。
解决方案
方法1:用np.apply_along_axis批量处理
利用np.apply_along_axis将插值逻辑应用到yp的每一列(每一列对应一个独立的插值序列):
import numpy as np xp = np.array([0.0, 1.0, 2.0]) yp = np.array( [ [-1.1, 2.4, 5.1, 5.6], [7.1, -2.1, 9.1, 31.0], [1.1, 13.4, -5.2, 5.6], ] ) # 对yp的每一列执行插值操作 result = np.apply_along_axis(lambda y_col: np.interp(0.4, xp, y_col), axis=0, arr=yp) print(result) # 输出:[3.02 1.4 6.7 14.24]
方法2:手动计算线性插值(更高效)
np.interp本质是线性插值,当目标x落在xp的两个已知点之间时,可直接计算权重完成插值,避免循环开销:
import numpy as np xp = np.array([0.0, 1.0, 2.0]) yp = np.array( [ [-1.1, 2.4, 5.1, 5.6], [7.1, -2.1, 9.1, 31.0], [1.1, 13.4, -5.2, 5.6], ] ) x = 0.4 # 定位x所在的区间索引 idx = np.searchsorted(xp, x) - 1 # 计算插值权重 weight = (x - xp[idx]) / (xp[idx+1] - xp[idx]) # 执行线性插值 result = (1 - weight) * yp[idx] + weight * yp[idx+1] print(result) # 输出:[3.02 1.4 6.7 14.24]
补充说明
如果xp存在非单调的情况,需要先对xp及对应的yp按xp排序后,再执行上述插值操作。
内容的提问来源于stack exchange,提问作者Nico Schlömer
相关产品推荐
相关产品推荐

