嵌套循环中坐标追加配对及复制点距离计算问题排查
问题分析与解决
你的代码存在两个核心问题:
- 距离列表被错误填充:在tile循环中你把偏移量
i和j直接追加到dist里,导致列表混进了非距离数据;同时距离计算仅针对最后一组tile的点,最终24个元素里,18个是偏移坐标,6个是最后一组4个点的两两距离(组合数C(4,2)=6)。 - 距离计算范围缺失:你只在tile循环结束后处理了最后一次生成的点集,没有覆盖所有9组tile内的点,也未计算跨tile的点间距离(若有需求)。
修正方案
需求1:计算每个tile内部4个点的两两距离
如果要统计3×3网格中每个tile内的点对距离,代码调整如下:
import numpy as np import matplotlib.pyplot as plt import random import math # 专门存储距离 distances = [] scalevalue = 10 # 生成初始4个随机点 x = [random.uniform(1, 10) for _ in range(4)] y = [random.uniform(1, 10) for _ in range(4)] tiles = np.linspace(-scalevalue, scalevalue, 3) for i in tiles: for j in tiles: # 生成当前tile的点集 current_points = list(zip([xi + i for xi in x], [yj + j for yj in y])) plt.scatter([xi + i for xi in x], [yj + j for yj in y], c="black", s=3) # 计算当前tile内的点对距离 for p_idx in range(len(current_points)): for q_idx in range(p_idx + 1, len(current_points)): p = current_points[p_idx] q = current_points[q_idx] dist = math.sqrt((p[0] - q[0])**2 + (p[1] - q[1])**2) distances.append(dist) plt.show() print(f"总距离数量:{len(distances)}") # 9个tile×6组点对=54个 print(distances)
需求2:计算所有36个点(9×4)的两两距离
如果需要计算所有生成点之间的全局距离,先收集所有点再统一计算:
import numpy as np import matplotlib.pyplot as plt import random import math distances = [] all_points = [] scalevalue = 10 x = [random.uniform(1, 10) for _ in range(4)] y = [random.uniform(1, 10) for _ in range(4)] tiles = np.linspace(-scalevalue, scalevalue, 3) # 先收集所有生成的点 for i in tiles: for j in tiles: current_points = list(zip([xi + i for xi in x], [yj + j for yj in y])) all_points.extend(current_points) plt.scatter([xi + i for xi in x], [yj + j for yj in y], c="black", s=3) plt.show() # 计算全局所有点对的距离 for p_idx in range(len(all_points)): for q_idx in range(p_idx + 1, len(all_points)): p = all_points[p_idx] q = all_points[q_idx] dist = math.sqrt((p[0] - q[0])**2 + (p[1] - q[1])**2) distances.append(dist) print(f"总距离数量:{len(distances)}") # 组合数C(36,2)=630个 print(distances)
关键调整说明
- 将距离存储与偏移量彻底分离,避免数据混淆
- 根据需求选择计算范围:单tile内部或全局所有点
- 显式生成点集,避免依赖numpy隐式广播的潜在问题
内容的提问来源于stack exchange,提问作者Yeknic
相关产品推荐
相关产品推荐

