Networkx边缘属性

时间:2019-01-19 02:38:54

标签: python networkx

我有一个这样的有向图-

G = nx.DiGraph()
G.add_edge('a', 'b', attr=0.6)
G.add_edge('a', 'c', attr=0.2)
G.add_edge('d', 'a', attr=0.3)

如何遍历节点'a'以获得以下格式的属性

[0.6, 0.2, -0.3]

3 个答案:

答案 0 :(得分:1)

这应该做到,尽管可能有更好的方法:

In [3]: [G[e[0]][e[1]]['attr'] for e in  G.out_edges('a')] + [-G[e[0]][e[1]]['attr'] for e in  G.in_edges('a')]

Out[3]: [0.6, 0.2, -0.3]

上面的代码使用两个列表推导来循环遍历a的所有出站和入站边缘,并从边缘中选取属性,如果它来自入站边缘,则分配一个负值。

答案 1 :(得分:0)

以下是通过遍历图的edges.data()的一种解决方案。附注:我基本上是在JuPyter中使用制表符补全来查找属性,然后通过使用不同的属性来提出以下解决方案。这段代码只会为您提供'a'的属性。因此,如果将第四个节点添加为G.add_edge('d', 'b', attr=0.7),则输出将为[0.6, 0.2, -0.3],其中第四个节点不计算在内。

attributes = []

for edge in G.edges.data():
    if edge[0] == 'a':
        attributes.append(edge[-1]['attr'])
    elif edge[1] == 'a'   :
        attributes.append(-edge[-1]['attr'])

print (attributes)    
# [0.6, 0.2, -0.3]

答案 2 :(得分:0)

当我们有大图时,遍历所有边缘会很昂贵。 我建议找到特定节点的后继者和前任者,然后获取有关相应边缘的信息。

[G.get_edge_data('a',neigh)['attr'] for neigh in G.successors('a')] + \
[-G.get_edge_data(neigh,'a')['attr'] for neigh in G.predecessors('a')]