Python中从UnivariateSpline插值曲线提取指定X的Y值
获取UnivariateSpline插值曲线的任意X对应Y值
你已经完成了x的对数处理和样条拟合,要获取任意指定X对应的插值Y值,直接调用拟合好的spl对象即可,核心注意点是输入的X必须和拟合时的x保持一致的处理方式(即对数转换后的值)。
具体实现步骤
- 拟合得到
spl对象后,直接传入对数处理后的X值(单个或数组),即可得到对应的插值Y值。 - 如果你的指定值是原始未对数的数值,需要先通过
np.log()转换后再传入。
代码示例(基于你的现有代码扩展)
import numpy as np import matplotlib.pyplot as plt from scipy.interpolate import UnivariateSpline from scipy import stats # 原始数据处理 x = np.log([22.0, 27.0, 35.0, 40.0, 61.0, 71.0, 84.0, 118.0, 135.0, 175.0, 223.0, 285.0, 350.0, 444.0, 565.0, 702.0, 890.0, 1125.0, 1414.0, 1785.0, 2249.0, 2832.0, 5658.0, 7138.0, 8988.0, 11323.0, 14273.0, 17983.0, 22652.0]) y = [63.91, 67.88, 55.57, 82.9, 74.08, 22.27, 24.57, 18.51, 19.87, 16.22, 12.78, 10.42, 9.3, 8.11, 6.55, 5.72, 5.57, 7.0, 5.05, 5.45, 13.76, 2.69, 0.8, 0.75, 0.63, 0.59, 0.61, 0.68, 0.63] # 创建权重矩阵 z_score = np.abs(stats.zscore(y)) weight_spl = np.ones(len(x), dtype=int) for i in range(len(weight_spl)): if z_score[i] > 2: weight_spl[i] = 0 # 样条拟合 k = 3 # 多项式阶数 spl = UnivariateSpline(x, y, w=weight_spl, s=100, k=k) # ------------------- 获取指定X对应的Y值 ------------------- # 示例1:单个原始数值(如100),先转对数再传入 original_x = 100 log_x = np.log(original_x) y_pred = spl(log_x) print(f"原始值{original_x}对应的插值Y值:{y_pred}") # 示例2:多个原始数值,批量转换并获取 original_x_list = [50, 200, 500] log_x_list = np.log(original_x_list) y_pred_list = spl(log_x_list) print("批量原始值对应的插值Y值:") for ox, yp in zip(original_x_list, y_pred_list): print(f"原始值{ox}:{yp}") # 示例3:直接传入对数处理后的X值(如x最小值加1) specified_log_x = x.min() + 1 y_pred_direct = spl(specified_log_x) print(f"对数X值{specified_log_x}对应的插值Y值:{y_pred_direct}") # 保留原有绘图代码 xs = np.linspace(x.min(), x.max(), len(x)) plt.plot(x, y, 'ro', ms=5) plt.plot(xs, spl(xs), 'cyan', lw=2, alpha=0.3) plt.show()
关键说明
- 拟合时使用的是对数转换后的x数组,因此输入的X必须是经过
np.log()处理的数值,否则插值结果会完全不符合预期。 spl对象支持传入单个数值或numpy数组,可批量获取多个插值结果。
内容的提问来源于stack exchange,提问作者Farzad
相关产品推荐
相关产品推荐

