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

发布时间 - 2025-12-29 00:00:00    点击率:

本文介绍如何不依赖 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 原生语法,是教学与轻量级场景下构建距离矩阵的标准实践。


# python  # app  # 标准库 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何配置和使用队列处理异步任务_Laravel队列驱动与任务分发实例  厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?  如何生成腾讯云建站专用兑换码?  Laravel如何将应用部署到生产服务器_Laravel生产环境部署流程  Laravel API资源类怎么用_Laravel API Resource数据转换  图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?  Laravel怎么进行数据库事务处理_Laravel DB Facade事务操作确保数据一致性  html如何与html链接_实现多个HTML页面互相链接【互相】  Linux系统命令中tree命令详解  手机怎么制作网站教程步骤,手机怎么做自己的网页链接?  如何正确下载安装西数主机建站助手?  中国移动官方网站首页入口 中国移动官网网页登录  如何快速搭建自助建站会员专属系统?  UC浏览器如何切换小说阅读源_UC浏览器阅读源切换【方法】  Python进程池调度策略_任务分发说明【指导】  Laravel如何处理CORS跨域请求?(配置示例)  利用vue写todolist单页应用  如何快速配置高效服务器建站软件?  香港服务器网站生成指南:免费资源整合与高速稳定配置方案  Laravel storage目录权限问题_Laravel文件写入权限设置  Laravel模型关联查询教程_Laravel Eloquent一对多关联写法  Laravel Seeder怎么填充数据_Laravel数据库填充器的使用方法与技巧  移动端脚本框架Hammer.js  大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?  在线制作视频网站免费,都有哪些好的动漫网站?  制作电商网页,电商供应链怎么做?  Laravel怎么进行浏览器测试_Laravel Dusk自动化浏览器测试入门  IOS倒计时设置UIButton标题title的抖动问题  香港服务器网站卡顿?如何解决网络延迟与负载问题?  公司门户网站制作流程,华为官网怎么做?  手机网站制作与建设方案,手机网站如何建设?  Laravel怎么连接多个数据库_Laravel多数据库连接配置  如何在阿里云完成域名注册与建站?  Laravel如何使用Eloquent ORM进行数据库操作?(CRUD示例)  今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】  网易LOFTER官网链接 老福特网页版登录地址  Laravel如何监控和管理失败的队列任务_Laravel失败任务处理与监控  Laravel如何处理表单验证?(Requests代码示例)  如何在万网利用已有域名快速建站?  Laravel如何正确地在控制器和模型之间分配逻辑_Laravel代码职责分离与架构建议  高防服务器如何保障网站安全无虞?  专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?  如何用免费手机建站系统零基础打造专业网站?  iOS发送验证码倒计时应用  微信公众帐号开发教程之图文消息全攻略  魔方云NAT建站如何实现端口转发?  Laravel用户认证怎么做_Laravel Breeze脚手架快速实现登录注册功能  Laravel如何与Pusher实现实时通信?(WebSocket示例)  javascript日期怎么处理_如何格式化输出  java ZXing生成二维码及条码实例分享