我有一个这样的有向图-
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]
答案 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')]