Python中如何无迭代实现2D折线数据点的密度加倍
解决方案
方案1:纯NumPy向量化实现(仅适用加倍场景,性能最优)
直接用NumPy广播特性计算所有相邻点位中点,再和原点位交错合并即可,全程无Python层级循环,性能远高于迭代实现,完美解决你遇到的顺序错误问题:
import numpy as np import matplotlib.pyplot as plt # 原始数据 x = np.array([0,1,2]) y = np.array([5,6,4]) # 批量计算相邻点中点 mid_x = (x[:-1] + x[1:]) / 2 mid_y = (y[:-1] + y[1:]) / 2 # 交错合并原点位和中点,得到顺序正确的结果 new_x = np.column_stack([x[:-1], mid_x]).flatten() new_x = np.append(new_x, x[-1]) new_y = np.column_stack([y[:-1], mid_y]).flatten() new_y = np.append(new_y, y[-1])
运行后输出结果和你预期完全一致:new_x = [0. 0.5 1. 1.5 2. ]new_y = [5. 5.5 6. 5. 4. ]
方案2:参数化线性插值(适配任意采样倍率,扩展性强)
如果后续需要调整点位密度(比如3倍、4倍重采样),可以用基于路径参数的线性插值方案,只需要修改采样步长即可实现任意密度的重采样:
import numpy as np from scipy.interpolate import interp1d x = np.array([0,1,2]) y = np.array([5,6,4]) # 构造路径参数t,对应原始点位的先后顺序 t = np.arange(len(x)) # 生成重采样后的t,步长=1/采样倍率,加倍场景用步长0.5 t_new = np.arange(0, len(x)-1, 0.5) t_new = np.append(t_new, len(x)-1) # 分别对x、y相对于t做线性插值 f_x = interp1d(t, x, kind='linear') f_y = interp1d(t, y, kind='linear') new_x = f_x(t_new) new_y = f_y(t_new)
内容的提问来源于stack exchange,提问作者zabop
相关产品推荐
相关产品推荐

