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

本文介绍如何不依赖 numpy 或 pandas,仅用标准库和嵌套循环,将一组具有 x/y 坐标的客户对象构建成完整的二维距离矩阵(即对称方阵),其中 `distances[i][j]` 表示第 i 位客户与第 j 位客户之间的欧氏距离。

要生成真正的二维距离矩阵(而非一维扁平列表),关键在于:外层循环按客户索引 i 迭代,内层循环为该客户 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)  # 将整行加入矩阵

此时 Distances 是一个 nr_customers × nr_customers 的嵌套列表,满足:

  • Distances[i][j] 即客户 i 到客户 j 的距离;
  • 对角线元素 Distances[i][i] 恒为 0.0(自距离);
  • 矩阵关于主对角线对称(因欧氏距离满足 d(i,j) = d(j,i))。

注意事项

  • 务必确保 customer 是已定义的客户对象列表,且每个对象实现了 getX() 和 getY() 方法;
  • 若客户数量较大(如 >1000),该 O(n²) 算法仍可运行,但性能不如向量化库;不过本方案严格遵守“禁用 NumPy/Pandas”的约束;
  • 可进一步封装为函数提升复用性:
def build_distance_matrix(customers):
    n = len(customers)
    matrix = []
    for i in range(n):
        row = []
        for j in range(n):
            row.append(get_distance(customers[i], customers[j]))
        matrix.append(row)
    return matrix

# 使用示例
Distances = build_distance_matrix(customer)

该方法简洁、可读性强,完全基于 Python 原生语法,是教学与轻量级场景下构建距离矩阵的标准实践。