如何对有序数据点进行线性插值,生成其连接线上的额外数值点
问题原因
scipy.interpolate.interp1d默认要求输入的自变量序列为单调递增序列,插值时会自动按自变量大小排序处理,完全忽略原始数据的排列顺序,因此直接对value1插值value2的方案不适用于这类路径型有序数据。
解决方案
采用参数化路径插值的方式实现需求,通过引入中间参数记录原始点的排列顺序,分别对两个维度做插值,即可得到沿原始路径分布的插值点,具体实现代码如下:
import numpy as np from scipy import interpolate import pandas as pd import matplotlib.pyplot as plt # 原始数据 df = pd.DataFrame({ 'value1': [1,4,2,3], 'value2': [5,4,6,6] }) ut = df['value1'].values vt = df['value2'].values # 构造路径参数t,用累计欧氏距离归一化得到,保证插值点分布均匀 # 计算相邻点距离 seg_distance = np.sqrt(np.diff(ut)**2 + np.diff(vt)**2) # 累计距离后归一化到0-1区间 cum_distance = np.insert(np.cumsum(seg_distance), 0, 0) t = cum_distance / cum_distance[-1] # 分别拟合x、y关于t的线性插值函数 f_x = interpolate.interp1d(t, ut, kind='linear') f_y = interpolate.interp1d(t, vt, kind='linear') # 生成100个均匀分布的t值,计算对应的插值点 new_t = np.linspace(0, 1, 100, endpoint=True) new_x = f_x(new_t) new_y = f_y(new_t) # 绘图验证结果 plt.plot(ut, vt, 'o-', label='原始路径') plt.plot(new_x, new_y, '.', label='插值点') plt.legend() plt.show()
上述方案生成的插值点会严格遵循原始数据的排列顺序,沿原始折线分布,完全符合需求。
内容的提问来源于stack exchange,提问作者Bob
相关产品推荐
相关产品推荐

