Networkx普通图转MultiGraph时is_multigraphical返回false问题
问题根本原因
你遇到的现象和普通图转MultiGraph的转换逻辑没有任何关系,核心是对is_multigraphical()方法的功能存在完全错误的理解:
nx.is_multigraphical()的设计用途是校验非负整数组成的度序列是否满足可构造无向多重图的充要条件(即序列所有数值之和为偶数,多重图每条边为两个节点各贡献1个度,总度数必为偶数),它的入参要求是整数序列,从来不是用来判断「传入对象是否为MultiGraph类型实例」的工具。- 当你把图实例直接传入该方法时,Python会默认迭代图对象,而Networkx中图实例迭代的返回值是所有节点的ID,相当于你把节点ID列表误当成度序列做了校验:
- 测试用的3节点完全图
complete_graph(3)节点ID为0、1、2,传入后等效校验序列[0,1,2],总和为3(奇数),自然返回False - 测试用的10节点路径图
path_graph(10)节点ID为0到9,传入后等效校验序列[0,1,2,...,9],总和为45(奇数),自然返回False - 最后一个自定义边的测试用例返回True完全是巧合:该用例节点ID为1、2、3,传入后等效校验序列
[1,2,3],总和为6(偶数),刚好满足多重图度序列校验规则,和图本身是不是多重图没有关联。你可以自行验证:把该用例的节点ID改成0、1、2,边结构完全不变,调用is_multigraphical()会直接返回False。
- 测试用的3节点完全图
正确转换与校验方式
你之前尝试的所有普通图转MultiGraph的写法全部是正确的,不存在转换失败的问题,只是校验方法用错了。
- 判断一个图实例是否为多重图类型,使用以下两种任意一种方式即可:
- 调用图实例自带的方法:
G.is_multigraph(),MultiGraph/MultiDiGraph实例会返回True,普通Graph/DiGraph实例返回False - 做类型校验:
isinstance(G, nx.MultiGraph)
- 调用图实例自带的方法:
- 验证代码示例:
import networkx as nx # 构造普通无向图 p = nx.complete_graph(3) print(p.is_multigraph()) # 输出False,普通图不是多重图 # 转换方式1:直接传入普通图初始化MultiGraph pMulti1 = nx.MultiGraph(incoming_graph_data=p) print(pMulti1.is_multigraph()) # 输出True,转换成功 print(isinstance(pMulti1, nx.MultiGraph)) # 输出True # 转换方式2:逐边添加 pMulti2 = nx.MultiGraph() for u, v in p.edges: pMulti2.add_edge(u, v) print(pMulti2.is_multigraph()) # 输出True,转换成功 # 转换方式3:批量加边 pMulti3 = nx.MultiGraph() pMulti3.add_edges_from(p.edges) print(pMulti3.is_multigraph()) # 输出True,转换成功 # is_multigraphical()的正确用法:传入度序列 degree_seq = [d for _, d in p.degree()] print(nx.is_multigraphical(degree_seq)) # 输出True,该度序列总度数为6是偶数,可构造多重图
内容的提问来源于stack exchange,提问作者Stephen Rodriguez
相关产品推荐
相关产品推荐

