我有一个图形,其中有四个节点,每个节点之间有两个方向边(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只给出{}。
有人可以提出解决方案或指出我出错的地方。
答案 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))