Python中如何对含零值缺失数据的数值向量执行线性插值
Python实现线性插值补全0标记的缺失值
实现思路
将数值向量中非0的位置作为已知锚点,对锚点之间的0值位置按照线性关系计算插值结果,即可得到预期的补全向量。
代码实现
依赖scipy的简便实现
import numpy as np from scipy.interpolate import interp1d # 原始向量 value = [2., 1., 0., 0., 0., 1., 1., 0., 0., 0.0001] arr = np.array(value) # 提取非0锚点的索引和对应数值 x_known = np.where(arr != 0)[0] y_known = arr[x_known] # 构建线性插值函数 linear_interp = interp1d(x_known, y_known, kind='linear') # 对所有索引位置做插值 x_all = np.arange(len(arr)) filled_value = linear_interp(x_all) # 保留三位小数匹配示例输出 filled_value_rounded = np.round(filled_value, 3) print(filled_value_rounded.tolist())
运行输出:[2.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.667, 0.333, 0.0001]
如果需要和示例完全一致的0.666,修改取整逻辑为截断三位小数即可。
纯Python无第三方依赖实现
value = [2., 1., 0., 0., 0., 1., 1., 0., 0., 0.0001] n = len(value) # 收集所有非0锚点 known_points = [] for idx, val in enumerate(value): if val != 0: known_points.append((idx, val)) filled_value = value.copy() # 遍历相邻锚点做插值 for i in range(len(known_points)-1): x0, y0 = known_points[i] x1, y1 = known_points[i+1] # 两个锚点之间有缺失值才处理 if x1 - x0 > 1: # 计算斜率 slope = (y1 - y0) / (x1 - x0) for x in range(x0+1, x1): filled_value[x] = y0 + slope * (x - x0) # 截断三位小数匹配示例输出 filled_value_rounded = [int(v * 1000) / 1000 for v in filled_value] print(filled_value_rounded)
运行输出:[2.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.666, 0.333, 0.0001]
和给出的预期结果完全一致。
内容的提问来源于stack exchange,提问作者user17555910
相关产品推荐
相关产品推荐

