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

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

本文介绍如何不依赖 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 虽简洁高效,但因明确禁止使用第三方科学计算库,故不作为推荐解法,仅作知识补充。

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


# python  # app  # 标准库 


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


相关推荐: Laravel API路由如何设计_Laravel构建RESTful API的路由最佳实践  javascript基本数据类型及类型检测常用方法小结  油猴 教程,油猴搜脚本为什么会网页无法显示?  Linux系统运维自动化项目教程_Ansible批量管理实战  制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?  Python自动化办公教程_ExcelWordPDF批量处理案例  Laravel如何使用Service Provider注册服务_Laravel服务提供者配置与加载  Laravel怎么进行浏览器测试_Laravel Dusk自动化浏览器测试入门  jQuery中的100个技巧汇总  Laravel中的Facade(门面)到底是什么原理  jQuery validate插件功能与用法详解  详解jQuery中的事件  Laravel策略(Policy)如何控制权限_Laravel Gates与Policies实现用户授权  详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)  nodejs redis 发布订阅机制封装实现方法及实例代码  如何在建站主机中优化服务器配置?  深圳网站制作培训,深圳哪些招聘网站比较好?  深圳防火门网站制作公司,深圳中天明防火门怎么编码?  Laravel如何使用Gate和Policy进行授权?(权限控制)  Midjourney怎样加参数调细节_Midjourney参数调整技巧【指南】  软银砸40亿美元收购DigitalBridge 强化AI资料中心布局  Laravel辅助函数有哪些_Laravel Helpers常用助手函数大全  Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤  Laravel如何设置自定义的日志文件名_Laravel根据日期或用户ID生成动态日志【技巧】  WordPress 子目录安装中正确处理脚本路径的完整指南  如何快速生成ASP一键建站模板并优化安全性?  深圳网站制作平台,深圳市做网站好的公司有哪些?  昵图网官网入口 昵图网素材平台官方入口  Laravel怎么进行数据库事务处理_Laravel DB Facade事务操作确保数据一致性  详解CentOS6.5 安装 MySQL5.1.71的方法  大同网页,大同瑞慈医院官网?  Laravel如何监控和管理失败的队列任务_Laravel失败任务处理与监控  C语言设计一个闪闪的圣诞树  php嵌入式断网后怎么恢复_php检测网络重连并恢复硬件控制【操作】  UC浏览器如何设置启动页 UC浏览器启动页设置方法  Java解压缩zip - 解压缩多个文件或文件夹实例  大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?  Laravel如何从数据库删除数据_Laravel destroy和delete方法区别  rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted  百度输入法ai组件怎么删除 百度输入法ai组件移除工具  HTML5段落标签p和br怎么选_文本排版常用标签对比【解答】  宙斯浏览器怎么屏蔽图片浏览 节省手机流量使用设置方法  如何在腾讯云服务器上快速搭建个人网站?  哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?  深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?  zabbix利用python脚本发送报警邮件的方法  桂林网站制作公司有哪些,桂林马拉松怎么报名?  Win11任务栏卡死怎么办 Windows11任务栏无反应解决方法【教程】  Laravel如何处理文件下载请求?(Response示例)  简单实现Android验证码