1 条题解

  • 0
    @ 2026-3-26 13:01:53

    NUMPY052 题解:计算坐标点之间的距离矩阵

    题目

    给定 nn 个二维坐标点,计算所有点两两之间的距离,输出距离矩阵。

    解题思路

    1. 读取 nn 个点的坐标,存入数组
    2. 使用公式计算两点间欧几里得距离
    3. 利用广播一次性计算所有点对距离

    代码

    import numpy as np
    
    n = int(input())
    coords = []
    for _ in range(n):
        x, y = map(float, input().split())
        coords.append([x, y])
    
    Z = np.array(coords)
    X = np.atleast_2d(Z[:, 0])
    Y = np.atleast_2d(Z[:, 1])
    D = np.sqrt((X - X.T)**2 + (Y - Y.T)**2)
    print(D)
    

    代码详解

    读取输入

    n = int(input())  # 读取点的数量
    coords = []
    for _ in range(n):
        x, y = map(float, input().split())
        coords.append([x, y])
    Z = np.array(coords)
    

    计算距离矩阵

    X = np.atleast_2d(Z[:, 0])  # 提取所有 x 坐标,转为行向量
    Y = np.atleast_2d(Z[:, 1])  # 提取所有 y 坐标,转为行向量
    

    关键公式:

    • X - X.T:每个点 xx 坐标与所有点 xx 坐标的差(广播)
    • Y - Y.T:每个点 yy 坐标与所有点 yy 坐标的差(广播)
    • \texttt{np.sqrt}:计算欧几里得距离

    运行示例

    输入:

    3
    0 0
    3 4
    6 8
    

    分析:

    • (0,0)(0,0)(3,4)(3,4) 的距离 =9+16=5= \sqrt{9 + 16} = 5
    • (0,0)(0,0)(6,8)(6,8) 的距离 =36+64=10= \sqrt{36 + 64} = 10
    • (3,4)(3,4)(6,8)(6,8) 的距离 =9+16=5= \sqrt{9 + 16} = 5

    输出:

    [[ 0.  5. 10.]
     [ 5.  0.  5.]
     [10.  5.  0.]]
    

    核心知识点

    1. \texttt{np.atleast_2d} —— 确保数组至少是 2 维
    2. \texttt{X.T} —— 矩阵转置
    3. 广播机制 —— 自动扩展维度进行计算
    4. \texttt{np.sqrt} —— 计算平方根
    • 1

    信息

    ID
    299
    时间
    1000ms
    内存
    256MiB
    难度
    (无)
    标签
    (无)
    递交数
    0
    已通过
    0
    上传者