You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

已知距离下如何创建距离矩阵?求Python实现代码

将CSV节点距离转换为邻接矩阵的Python实现

没问题,我来帮你搞定这个需求!要把CSV里的节点距离转换成目标格式的邻接矩阵,咱们可以分几步实现,下面是具体的代码和思路:

核心思路

  1. 节点映射:把CSV里的字母节点(A、B、C)转换成数字索引(0、1、2),方便填充矩阵。
  2. 矩阵初始化:根据节点数量创建一个全零的N×N矩阵。
  3. 填充矩阵:遍历CSV的每一行,把距离值放到矩阵对应的位置,同时因为是无向图(A→B和B→A距离相同),需要对称填充。

基础实现(无需额外依赖)

如果不想用第三方库,用Python内置的csv模块就能完成:

import csv

# 读取CSV文件(替换成你的文件路径)
with open('distance_data.csv', 'r') as file:
    # 用DictReader读取,方便按列名访问
    csv_reader = csv.DictReader(file)
    rows = list(csv_reader)

# 收集所有唯一节点并排序,保证A→0、B→1、C→2的顺序
all_nodes = sorted(set(
    row['Start'].strip() for row in rows
).union(set(
    row['End'].strip() for row in rows
)))
# 创建节点到索引的映射字典
node_to_index = {node: idx for idx, node in enumerate(all_nodes)}
node_count = len(all_nodes)

# 初始化全零邻接矩阵
adjacency_matrix = [[0] * node_count for _ in range(node_count)]

# 遍历每一行数据填充矩阵
for row in rows:
    start_node = row['Start'].strip()
    end_node = row['End'].strip()
    distance = int(row['Distance'].strip())
    
    start_idx = node_to_index[start_node]
    end_idx = node_to_index[end_node]
    
    # 填充双向距离(无向图)
    adjacency_matrix[start_idx][end_idx] = distance
    adjacency_matrix[end_idx][start_idx] = distance

# 输出结果
print(adjacency_matrix)

简洁实现(用Pandas)

如果你的项目已经在用Pandas,用它来处理会更简洁:

import pandas as pd

# 读取CSV文件
df = pd.read_csv('distance_data.csv')

# 提取所有唯一节点并排序
all_nodes = sorted(pd.unique(df[['Start', 'End']].values.ravel()))
node_to_index = {node.strip(): idx for idx, node in enumerate(all_nodes)}
node_count = len(all_nodes)

# 初始化矩阵
adjacency_matrix = [[0] * node_count for _ in range(node_count)]

# 遍历数据填充
for _, row in df.iterrows():
    start_idx = node_to_index[row['Start'].strip()]
    end_idx = node_to_index[row['End'].strip()]
    distance = int(row['Distance'])
    
    adjacency_matrix[start_idx][end_idx] = distance
    adjacency_matrix[end_idx][start_idx] = distance

print(adjacency_matrix)

注意事项

  • 记得把代码里的distance_data.csv替换成你实际的CSV文件路径。
  • 用strip()处理节点和距离值是为了避免CSV里可能存在的空格(比如"A "这种带空格的节点名)导致映射错误。
  • 代码默认是无向图的场景(即A到B和B到A距离相同),如果是有向图,只需要去掉对称填充的那一行即可。

内容的提问来源于stack exchange,提问作者Doggy Face

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 15:22:39