Python列表式浮点数坐标带容差去重追加方法问询
解决浮点数坐标的近似存在性判断问题
我完全懂你的困扰——三角函数生成的浮点数坐标总会带点精度误差,明明是“几乎重合”的点,却被当成新坐标追加进去,这确实挺闹心的。下面给你两种实用的实现方案,既满足保持原列表类型的要求,又能灵活处理精度容忍度:
方法一:纯Python原生实现(无需额外依赖)
这种方案完全用原生Python写,适合不想引入numpy的场景。核心思路是计算坐标间的欧氏距离平方(省去开根号的步骤,提升计算效率),和容忍度的平方做比较:
def is_coord_approx_exist(coord, coord_list, tol): tol_squared = tol ** 2 for existing_coord in coord_list: # 计算两个坐标的欧氏距离平方 distance_squared = sum((a - b)**2 for a, b in zip(coord, existing_coord)) if distance_squared < tol_squared: return True return False
使用示例
coord_list = [[0,0],[1,0]] new_coord = [0.99999999999, 0.000000000001] tol = 1e-10 if not is_coord_approx_exist(new_coord, coord_list, tol): coord_list.append(new_coord) # 这里不会执行追加操作,因为函数返回True
方法二:用numpy优化(适合大规模坐标列表)
如果你的坐标列表非常大(比如上万条数据),纯Python遍历会有点慢,用numpy的向量运算能大幅提升效率。注意:这里只是临时把列表转成numpy数组计算,原列表的类型完全保持不变:
import numpy as np def is_coord_approx_exist_np(coord, coord_list, tol): # 临时转换为numpy数组做向量运算 existing_arr = np.array(coord_list) target_arr = np.array(coord) # 计算所有坐标与目标坐标的欧氏距离 distances = np.linalg.norm(existing_arr - target_arr, axis=1) # 判断是否存在距离小于容忍度的坐标 return np.any(distances < tol)
使用示例
coord_list = [[0,0],[1,0]] new_coord = [0.99999999999, 0.000000000001] tol = 1e-10 if not is_coord_approx_exist_np(new_coord, coord_list, tol): coord_list.append(new_coord) # 同样不会执行追加操作
小提示
- 两种方案都不会修改原
coord_list的列表类型,完全符合你的约束条件 - 优先推荐纯Python方案,除非你的坐标列表规模确实很大,再考虑numpy优化
- 用距离平方代替距离本身是个小技巧,能避免开根号的计算开销,结果判断完全等价
内容的提问来源于stack exchange,提问作者User123456789
相关产品推荐
相关产品推荐

