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

时间:2017-03-17 11:42:36

标签: python networkx

我使用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

就上下文而言,每条边的重量表示两个机场之间发生了多少次飞行,我的问题是不清楚哪条路线是什么?是最繁忙的'因为相关的边缘是相关的边缘。我希望画出最后重量最大的边缘,以便清楚哪条是最繁忙的航线。在网络中。

3 个答案:

答案 0 :(得分:1)

使用:

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

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

需要注意的是如果您为边权重选择了除 'weight' 以外的属性名称,则上面的代码行将不会工作,也不会显示任何错误,它什么也不做;因为它在所有情况下都会默认返回 'weight',因为它找不到键,因此不会有效地排序。一条边可以具有不同解释的不同属性,因此请务必根据您要排序的键选择键。