已知距离下如何创建距离矩阵?求Python实现代码
将CSV节点距离转换为邻接矩阵的Python实现
没问题,我来帮你搞定这个需求!要把CSV里的节点距离转换成目标格式的邻接矩阵,咱们可以分几步实现,下面是具体的代码和思路:
核心思路
- 节点映射:把CSV里的字母节点(A、B、C)转换成数字索引(0、1、2),方便填充矩阵。
- 矩阵初始化:根据节点数量创建一个全零的N×N矩阵。
- 填充矩阵:遍历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
相关产品推荐
相关产品推荐

