如何在多重图中

时间:2016-11-21 19:28:26

标签: python networkx

我有一个图形,其中有四个节点,每个节点之间有两个方向边(a到b和b到a),所以我使用了多重Digraph。该图已经默认定义了'权重'属性,对于我的情况,该属性表示每个边缘的流量流量。我需要为每条边定义两个以上的属性,比如说tcv1和tcv2。

作为Python和networkx的初学者,我无法弄清楚这一点。一些谷歌搜索带我here,但我无法正确使用它。

add_attribute_to_edge(router_matrix, tmp_path[0][0], tmp_path[0][1], 'tcv1', traffic_cv[0])

我使用上面的代码,其中router_matrix是图形,tmp_path [x] [x]将表示节点名称,如'a'或'b',tcv1是属性,代码中的traffic_cv [0]将是计算的整数。打印tcv1只给出{}。

有人可以提出解决方案或指出我出错的地方。

1 个答案:

答案 0 :(得分:1)

您可以使用add_edge函数向MultiDiGraph中的现有边添加新属性,但需要注意key关键字(其值必须为0)

在我的示例中,我将tcv1属性添加到第一个“a” - > “b”边缘(我使用您的变量名称和我用add_edges_from创建的示例图表):

import networkx as nx

router_matrix = nx.MultiDiGraph()

# add two weighted edges ("a" -> "b" and "b" -> "a")
router_matrix.add_edges_from([
    ("a", "b", {"weight": 0.5}),
    ("b", "a", {"weight": 0.99})
    ])

# print list of edges with all data
print(router_matrix.edges(data=True))

tmp_path = [["a", "b"], ["b", "a"]]
traffic_cv = [42, 66]

# add "tcv1" for only the first edge of tmp_path
router_matrix.add_edge(tmp_path[0][0], tmp_path[0][1], key=0, tcv1=traffic_cv[0])

print(router_matrix.edges(data=True))

要将tcv1添加到所有边缘,您可以使用router_matrix.edges()遍历所有边缘(请注意,此处我使用G[src_node][dest_node][key][attribute]语法而不是add_edge):< / p>

# add new attribute to all edges
counter = 0
for src, dest in router_matrix.edges():
    router_matrix[src][dest][0]['tcv1'] = traffic_cv[counter]
    counter += 1

print(router_matrix.edges(data=True))