如何在Python中将Excel中的带权边列表转换为邻接矩阵?
实现从Excel带权边列表到邻接矩阵的Python方法
没问题,我来帮你搞定这个需求!下面是一步步可落地的实现方案,代码直接就能跑~
1. 先装必要的依赖库
因为要读取Excel文件,我们需要用到pandas(处理表格数据)和openpyxl(支持xlsx格式读取),打开终端跑这行命令就行:
pip install pandas openpyxl
2. 完整实现代码
我写了一个封装好的函数,你直接传Excel文件路径就能生成邻接矩阵,还附带了注释方便你理解:
import pandas as pd import numpy as np def edge_list_to_adjacency_matrix(excel_path, is_undirected=False): """ 从Excel带权边列表生成邻接矩阵 :param excel_path: Excel文件路径 :param is_undirected: 是否为无向图,默认False(有向图) :return: 邻接矩阵(DataFrame格式,方便查看)、原始矩阵(numpy数组) """ # 读取Excel文件,没有表头所以指定header=None df = pd.read_excel(excel_path, header=None, names=['node1', 'node2', 'weight']) # 获取所有唯一节点,排序让矩阵更整齐 all_nodes = sorted(list(set(df['node1'].tolist() + df['node2'].tolist()))) node_count = len(all_nodes) # 建立节点到索引的映射(解决字符串不能当矩阵下标的问题) node_to_idx = {node: idx for idx, node in enumerate(all_nodes)} # 初始化全0的邻接矩阵 adj_matrix = np.zeros((node_count, node_count), dtype=int) # 遍历每一条边,填充权重 for _, row in df.iterrows(): u_idx = node_to_idx[row['node1']] v_idx = node_to_idx[row['node2']] adj_matrix[u_idx][v_idx] = row['weight'] # 如果是无向图,需要给反向边也赋值权重 if is_undirected: adj_matrix[v_idx][u_idx] = row['weight'] # 转成DataFrame格式,用节点名当行/列名,方便直观查看 adj_df = pd.DataFrame(adj_matrix, index=all_nodes, columns=all_nodes) return adj_df, adj_matrix
3. 示例用法
假设你的Excel文件(比如叫edges.xlsx)内容是这样的:
| 第一列 | 第二列 | 第三列 |
|---|---|---|
| Apple | Banana | 65 |
| Orange | Apple | 32 |
调用函数的代码如下:
# 生成邻接矩阵(这里假设是有向图,如果是无向图就把is_undirected设为True) adj_df, adj_matrix = edge_list_to_adjacency_matrix("edges.xlsx") # 打印直观的DataFrame格式 print("邻接矩阵(带节点名):") print(adj_df) # 打印numpy数组格式(如果需要做数值计算用这个) print("\n原始矩阵:") print(adj_matrix)
运行后输出的结果会是:
邻接矩阵(带节点名): Apple Banana Orange Apple 0 65 0 Banana 0 0 0 Orange 32 0 0 原始矩阵: [[ 0 65 0] [ 0 0 0] [32 0 0]]
几个关键细节说明
- 字符串节点处理:通过
node_to_idx把字符串节点映射成数字索引,完美解决了字符串不能直接作为矩阵下标的问题 - 有向/无向图切换:如果你的图是无向图(比如Apple到Banana的边和Banana到Apple的边权重一样),只需要调用函数时传入
is_undirected=True就行 - 空边处理:默认没有边的位置填充0,如果需要用
NaN表示无连接,可以把初始化矩阵的np.zeros改成np.full((node_count, node_count), np.nan),同时把dtype=int去掉
内容的提问来源于stack exchange,提问作者ABAA
相关产品推荐
相关产品推荐

