如何使用Python读取文本数据创建各a(i,j)值已知的N×N矩阵
Python实现从文本数据构建N×N节点关系矩阵
需求梳理
- 输入:存储节点关系的文本文件,每行格式为
起始节点 终止节点 关系值,示例数据:
A B 1
B C -1
A C 1
B D 1
D A -1
C D 1
- 规则:
- 矩阵行列索引为文本中出现的所有不重复节点,示例对应索引为A、B、C、D
- 矩阵对角线元素固定为0
- 非对角线位置按照文本中给出的关系值填充,矩阵为对称结构(即a(i,j)和a(j,i)取值相同)
- 目标输出矩阵结构:
| A | B | C | D | |
|---|---|---|---|---|
| A | 0 | 1 | 1 | -1 |
| B | 1 | 0 | -1 | 1 |
| C | 1 | -1 | 0 | 1 |
| D | -1 | 1 | 1 | 0 |
实现代码
代码自动识别节点数量N,不需要手动配置矩阵维度,支持任意数量的节点输入:
from collections import defaultdict def build_relation_matrix(file_path): edge_map = defaultdict(int) node_set = set() # 读取并解析文本数据 with open(file_path, 'r', encoding='utf-8') as f: for line in f: line = line.strip() if not line: continue node1, node2, val = line.split() val = int(val) node_set.add(node1) node_set.add(node2) # 对称赋值 edge_map[(node1, node2)] = val edge_map[(node2, node1)] = val # 生成有序节点列表,固定行列索引顺序 node_list = sorted(node_set) n = len(node_list) node_index = {node: idx for idx, node in enumerate(node_list)} # 初始化N×N零矩阵 matrix = [[0 for _ in range(n)] for _ in range(n)] # 填充非对角线关系值 for (u, v), val in edge_map.items(): matrix[node_index[u]][node_index[v]] = val return node_list, matrix def pretty_print_matrix(node_list, matrix): # 格式化打印,对齐输出 header = " " + " ".join([f"{node:>3}" for node in node_list]) print(header) for idx, row in enumerate(matrix): row_str = f"{node_list[idx]:<3} " + " ".join([f"{num:>3}" for num in row]) print(row_str) # 调用示例:将下方路径替换为你的实际文本文件路径 if __name__ == "__main__": nodes, mat = build_relation_matrix("relation_data.txt") pretty_print_matrix(nodes, mat)
补充说明
- 如果需要结构化的表格格式输出,可以搭配pandas使用,追加以下代码即可得到DataFrame格式的矩阵:
import pandas as pd matrix_df = pd.DataFrame(mat, index=nodes, columns=nodes) print(matrix_df)
- 代码默认对节点做字典序排序,如果需要自定义行列顺序,替换
sorted(node_set)部分的逻辑即可 - 文本中如果存在重复的节点对记录,后读取的记录会覆盖之前的取值
内容的提问来源于stack exchange,提问作者Vasudev Archak
相关产品推荐
相关产品推荐

