NetworkX返回错误边索引问题排查求助
问题根源:节点ID不连续导致邻接矩阵与边列表不匹配
你遇到的差异本质是输入的g1、g2的节点ID不是从0开始的连续整数,而nx.to_numpy_array()会自动按节点ID排序后生成邻接矩阵,导致边列表中的原始节点ID和邻接矩阵的索引(对应排序后的节点)无法直接对应。
具体分析
- 从第一个输出的边列表能看到存在
[4,10]这类节点ID,但邻接矩阵是9×9(对应9个节点),说明输入图的节点ID是离散的(比如包含4、5、7、8、9、10等非连续数值)。 nx.to_numpy_array()生成邻接矩阵时,会先对图的节点ID进行排序,再按排序后的顺序生成矩阵。比如节点ID排序后是[4,5,6,7,8,9,10,...],那么邻接矩阵的第0行对应节点4,第1行对应节点5,以此类推。但g.edges()返回的是原始节点ID,所以看起来和邻接矩阵“不匹配”。- 而硬编码邻接矩阵生成的图,
nx.from_numpy_array()默认会创建从0开始的连续整数节点ID,所以边列表的节点ID和邻接矩阵索引完全对应,结果符合预期。
验证方法
在你的prepareData函数循环里添加节点打印,就能看到离散的节点ID:
for i, g in enumerate(graphs): print("节点ID列表:", g.nodes()) # 添加这行 n_nodes = g.number_of_nodes() # 剩余代码不变
解决方法
如果需要让节点ID与邻接矩阵索引一一对应,可以用nx.convert_node_labels_to_integers()重新编号节点,将其转为从0开始的连续整数:
def prepareData(g1, g2): graphs = [(g1, g2)] Graphs = [] for graph in graphs: for inergraph in graph: # 重新编号节点 reindexed_graph = nx.convert_node_labels_to_integers(inergraph, first_label=0) Graphs.append(reindexed_graph) graphs = Graphs for i, g in enumerate(graphs): n_nodes = g.number_of_nodes() n_edges = g.number_of_edges() edges = np.array(g.edges(), dtype=np.int32) print(nx.to_numpy_array(g)) print() print(edges) print()
内容的提问来源于stack exchange,提问作者user3748950
相关产品推荐
相关产品推荐

