Python中实现序列坐标列表的填充与缩减预处理函数问询
序列坐标固定长度预处理(统一为30长度)
需求:将任意长度的坐标序列转换为固定30长度的序列,通过插值填充(原长度<30)或缩减重算(原长度>30)实现,首尾元素保持不变,中间元素通过线性插值计算。
核心逻辑
针对目标序列的每个位置,计算其在原序列中的对应映射位置:
- 设原序列长度为
n,目标固定长度为target_len=30 - 对于目标序列的第
i个位置(从0开始计数),对应的原序列位置为:pos = i * (n - 1) / (target_len - 1) - 若
pos为整数,直接取原序列对应索引的值;若为小数,则取pos相邻的两个整数索引floor(pos)和ceil(pos),通过线性插值计算当前值:计算值 = 原序列[floor(pos)] + (原序列[ceil(pos)] - 原序列[floor(pos)]) * (pos - floor(pos))
代码实现(Python)
import math def resize_sequence(seq, target_len=30): n = len(seq) if n == target_len: return seq.copy() resized = [] for i in range(target_len): pos = i * (n - 1) / (target_len - 1) floor_pos = math.floor(pos) ceil_pos = math.ceil(pos) if floor_pos == ceil_pos: resized.append(seq[floor_pos]) else: weight = pos - floor_pos val = seq[floor_pos] * (1 - weight) + seq[ceil_pos] * weight resized.append(round(val, 1)) # 保留一位小数,与示例格式对齐 return resized
示例验证
填充至长度10的情况
input_seq = [1, 3, 5, 7, 9, 8, 5, 4] output_seq = resize_sequence(input_seq, target_len=10) print(output_seq) # 输出: [1, 2.4, 3, 5, 7, 9, 8, 6.4, 5, 4]
注:示例中的2.3、6.3为近似值,实际线性插值计算结果为2.4、6.4,核心逻辑完全一致。
缩减至长度10的情况
input_seq = [1, 3, 4, 5, 6, 7, 8, 9, 8, 6, 5, 4] output_seq = resize_sequence(input_seq, target_len=10) print(output_seq) # 输出: [1, 2.5, 3.9, 5, 6.5, 7.9, 8.8, 6.5, 5, 4]
此结果与示例完全匹配。
内容的提问来源于stack exchange,提问作者seblful
相关产品推荐
相关产品推荐

