如何在纯 Python 中构建客户坐标间的二维距离矩阵

本文介绍如何不依赖 numpy 或 pandas,仅用标准库和嵌套循环,将一组具有 x/y 坐标的客户对象构建成完整的二维距离矩阵(即对称方阵),每行表示某客户到所有客户的欧氏距离。

要生成真正的二维距离矩阵(而非扁平化的一维列表),关键在于:外层循环遍历每个客户 i,内层循环计算 i 到所有客户 j 的距离,并将这些距离收集为一个子列表;再将该子列表整体追加到主列表中。这样最终得到的 Distances 就是一个 n × n 的嵌套列表,满足 Distances[i][j] 表示第 i 个客户到第 j 个客户的欧氏距离。

以下是修正后的完整实现(假设已导入 math.sqrt):

from math import sqrt

# 距离计算函数(优化版:直接返回,避免中间变量)
def get_distance(a, b):
    dx = a.getX() - b.getX()
    dy = a.getY() - b.getY()
    return sqrt(dx * dx + dy * dy)

# 构建二维距离矩阵
Distances = []
for i in range(nr_customers):
    row = []  # 初始化第 i 行
    for j in range(nr_customers):
        row.append(get_distance(customer[i], customer[j]))
    Distances.append(row)  # 将整行加入矩阵

结果验证示例
若 nr_customers = 3,则 Distances 形如:

[
    [0.0,      d01,      d02],   # customer[0] → all
    [d10,      0.0,      d12],   # customer[1] → all
    [d20,      d21,      0.0]    # customer[2] → all
]

由于欧氏距离对称,dij == dji,且对角线恒为 0.0(自身到自身距离为 0)。

⚠️ 注意事项

  • 确保 customer 是长度为 nr_customers 的客户对象列表,且每个对象实现了 getX() 和 getY() 方法;
  • 若需提升性能(尤其客户数 > 1000),可考虑提前缓存坐标元组(如 coords = [(c.getX(), c.getY()) for c in customer]),避免重复调用方法;
  • 本方案时间复杂度为 O(n²),空间复杂度也为 O(n²),适用于中小规模数据;
  • 文中提及的 scipy.spatial.distance_matrix 虽简洁高效,但因明确禁止使用第三方科学计算库,故不作为推荐解法,仅作知识补充。

至此,你已获得一个结构清晰、可直接索引访问的标准二维距离矩阵,可用于后续路径规划、聚类分析或启发式算法等场景。