从MatLab导出文件导入图数据到Networkx或NNGT的实现问题
问题原因及解决方案
报错根因
- 第一次调用
nx.read_edgelist返回空图:read_edgelist默认按空白字符分割内容,你的边列表用逗号作为分隔符,未指定分隔符参数导致无法正确识别边。 - 第二次添加边报错:你调用
split()时未指定按逗号分割,每行内容被作为单个字符串存入列表,生成的是单元素列表而非2/3元组,不符合add_edges_from的参数要求。
修正后的边列表导入代码
无权重边导入
import networkx as nx G = nx.DiGraph() # 方法1:直接用read_edgelist指定分隔符 G = nx.read_edgelist('sample.txt', delimiter=',', create_using=nx.DiGraph) # 方法2:手动读取文件添加 with open('sample.txt') as f: lines = f.readlines() edge_list = [] for line in lines: line = line.strip() if not line: continue u, v = line.split(',') # 如果需要节点为整型,可以加u = int(u), v = int(v) edge_list.append((u, v)) G.add_edges_from(edge_list)
带权重边导入
如果你的边列表格式为源节点,目标节点,权重,修改为如下逻辑即可:
# read_edgelist方式 G = nx.read_edgelist('sample.txt', delimiter=',', create_using=nx.DiGraph, data=(('weight', float),)) # 手动读取方式 for line in lines: line = line.strip() if not line: continue u, v, w = line.split(',') edge_list.append((int(u), int(v), {'weight': float(w)}))
最终需求实现方案
1. 含孤立节点的NNGT有向图构建
不需要提前通过NetworkX中转,直接用NNGT接口实现更简单,可直接指定总节点数,自动保留无关联边的孤立节点:
import nngt import numpy as np # 假设你需要的总节点数为100,按实际需求修改 total_nodes = 100 # 先从边列表生成加权邻接矩阵,形状为[total_nodes, total_nodes] adj_matrix = np.zeros((total_nodes, total_nodes), dtype=float) with open('sample.txt') as f: for line in f: line = line.strip() if not line: continue # 带权重就加第三个参数w u, v = map(int, line.split(',')) # 注意节点编号如果是从1开始的,要减1转为0起始索引 adj_matrix[u-1][v-1] = 1 # 带权重就替换为float(w) # 直接生成NNGT有向图,自动保留所有孤立节点 g = nngt.Graph(total_nodes, directed=True, weighted=True) g.set_adjacency_matrix(adj_matrix)
如果需要从NetworkX转换,补充添加缺失节点后再转换即可:
# 先补全所有节点 all_nodes = list(range(1, total_nodes+1)) # 如果节点是1起始的 G.add_nodes_from(all_nodes) # 转换为NNGT图 g = nngt.Network.from_networkx(G)
2. 适配MatLab导出格式的导入方案
MatLab支持导出的两种常用格式都可以直接适配:
- 边列表格式:MatLab将边和权重导出为csv格式的三列数据(源节点、目标节点、权重),用上述代码直接读取即可。
- 邻接矩阵格式:MatLab将邻接矩阵导出为
.mat文件或者csv文件:- 读取
.mat文件用scipy.io.loadmat('adj_matrix.mat')直接提取邻接矩阵,传入NNGT的set_adjacency_matrix方法即可。 - 读取csv格式邻接矩阵用
np.loadtxt('adj_matrix.csv', delimiter=',')提取矩阵后直接传入即可。
- 读取
内容的提问来源于stack exchange,提问作者Tormey R
相关产品推荐
相关产品推荐

