如何在边权重为0/1的NetworkX无向图中创建新边
嘿,看起来你已经用NetworkX搭好了一个带0/1权重的无向图,要给它添加新边其实超简单,我给你整理了几种常用的方法,刚好能适配你的场景:
在NetworkX无向图中添加新边的方法
1. 添加单个带权重的边
直接用你创建原图时用到的G.add_edge()方法就好,完全兼容你现有的写法。比如想给节点d和e加一条权重为0的边,或者给b和c加权重1的边:
# 给d和e添加权重为0的边 G.add_edge('d', 'e', weight=0) # 给b和c添加权重为1的边 G.add_edge('b', 'c', weight=1)
要是你没指定weight参数,这条边就不会有weight属性,不过你的场景里都是0或1权重,建议还是显式写清楚更稳妥。
2. 批量添加多条边
如果要一次性加好多边,用G.add_edges_from()效率更高。你可以传入一个列表,每个元素可以是单纯的节点对,也可以是带权重字典的三元组:
# 批量添加不同权重的边 G.add_edges_from([ ('b', 'd', {'weight': 1}), ('e', 'f', {'weight': 0}), ('a', 'f') # 这条边没有指定权重,不会有weight属性 ])
要是你要加的新边权重都一样,还能简化写法,直接在方法里统一指定weight参数:
# 给所有新添加的边统一设置权重为1 G.add_edges_from([('b', 'e'), ('d', 'f')], weight=1)
3. 调整边的权重(可选)
如果不小心加错了权重,或者想修改已有边的权重,直接重新调用add_edge()就行——无向图里重复添加同一条边,只会更新它的属性,不会重复创建:
# 把a-c边的权重从0改成1 G.add_edge('a', 'c', weight=1)
4. 同步更新边的分类列表
你原来的代码里用elarge和esmall区分了权重1和0的边,添加新边后记得重新生成这两个列表,这样后续画图的时候新边才会被正确归类显示:
# 重新生成权重为1和0的边列表 elarge = [(u, v) for (u, v, d) in G.edges(data=True) if d['weight'] == 1] esmall = [(u, v) for (u, v, d) in G.edges(data=True) if d['weight'] == 0]
内容的提问来源于stack exchange,提问作者Haroon S.
相关产品推荐
相关产品推荐

