如何根据边缘的权重对 networkx 中的边缘进行排序



I a 使用 NetworkX 在 python 中进行网络分析。我确定每条边的权重,并通过以下方式将该边添加到图形中:

import matplotlib.pyplot as plt
import networkx as nx
import numpy as np

airports = ['ATL','LAX','ORD']
weights  = [500,200,150] #Note that in my real code I I calculated these weights, they are not provided
G = nx.Graph()
G.add_nodes_from(airports)
weightlst = []
airports_pos = []
checked_airports = []
i = 0
for airport1 in airports:
for airport2 in airports:
if airport1 != airport2 and  checked_airports.count([airport1,airport2])==0 and checked_airports.count([airport2,airport1])==0:
weightedge = weights[i]
weightlst.append(weightedge)
weightedge = weightedge*0.0020+0.5
G.add_edge(airport1, airport2, weight=weightedge)
checked_airports.append([airport1,airport2])
i = i + 1

对于上下文,每个边的权重表示两个机场之间有多少航班,我的问题是不清楚哪些"路线"是"最繁忙的",因为不相关的边被绘制在相关边上。我希望最后绘制权重最高的边缘,以便清楚地了解哪些是网络中"最繁忙的飞行路线"。

使用:

edges=sorted(G.edges(data=True), key=lambda t: t[2].get('weight', 1))

添加到所选答案中,因为它可能感觉有些复杂......(由于信誉不足而无法发表评论,编辑请求被拒绝 ̄\(ツ)/̄)

G.edges返回添加到图形G的边列表(每条边由两个元素的元组表示:开始节点和结束节点),将其data属性设置为True包括为该列表中的每条边设置的权重,作为元组的第三个元素作为字典, 其中权重的键是为边权重设置的属性名称(默认为'weight')。

lambda 函数评估每个元组t,并通过第三个元素(即字典)比较它们,方法是获取与键'weight'对应的值,如果未找到该键,则默认为 1。

需要注意的是, 如果你为边权重选择了'weight'以外的属性名称,上面的代码行将不起作用,也不会显示任何错误,它什么也不做;因为它在所有情况下都会默认返回1,因为它找不到键,因此有效地不排序。边缘可以具有不同解释的不同属性,因此请确保选择要基于其排序的键。

将所有边缘数据放在一个列表中,然后使用自定义键函数对其进行排序(这很容易查找)。NetworkX 可能没有任何功能来执行您想要的操作,因为它不需要这样做。

最新更新