将新属性添加到networkx中的边缘

Ste*_* C. 20 python attributes graph networkx

我拥有:在networkx whit节点中导入的图形G和由gml文件加载的egdes.
问题:如何向选定边添加新属性E.
我想做什么:我想为图的特定边E添加新属性'type'.注意:此边缘E不存在属性"type".

我在互联网和这里阅读了很多解决方案,但这些解决方案中没有一个解决了我的问题.实际上我的代码是:

  G.edge[id_source][id_target]['type']= value
Run Code Online (Sandbox Code Playgroud)

但是如果我打印G的所有边缘,现在我有n + 1条边,G的所有旧边和新边p =(id_source,id_target,{'type'= value}).此外,旧边E(我想修改的那个)没有新属性'type'.

所以我的代码添加了一个新的边缘(我不想要).
我想更新旧的添加不存在的新属性.

谢谢您的帮助 !

编辑:已解决 感谢Aric和一些技巧我解决了我的问题:

  G.edge[id_source][id_target]['type']= value
Run Code Online (Sandbox Code Playgroud)

Ari*_*ric 11

您可能有一个networkx MultiGraph而不是图形,在这种情况下,边缘的属性设置有点小问题.(您可以通过加载节点之间具有多个边缘的图形来获取多图形).您可能在G.edge[id_source][id_target]['type']= value需要时 通过分配属性来破坏数据结构 G.edge[id_source][id_target][key]['type']= value.

以下是Graphs和MultiGraphs的不同工作方式示例.

对于Graph案例,属性的工作方式如下:

In [1]: import networkx as nx

In [2]: G = nx.Graph()

In [3]: G.add_edge(1,2,color='red')

In [4]: G.edges(data=True)
Out[4]: [(1, 2, {'color': 'red'})]

In [5]: G.add_edge(1,2,color='blue')

In [6]: G.edges(data=True)
Out[6]: [(1, 2, {'color': 'blue'})]

In [7]: G[1][2]
Out[7]: {'color': 'blue'}

In [8]: G[1][2]['color']='green'

In [9]: G.edges(data=True)
Out[9]: [(1, 2, {'color': 'green'})]
Run Code Online (Sandbox Code Playgroud)

使用MultiGraphs时,还有一个额外级别的键可以跟踪平行边缘,因此它的工作方式略有不同.如果没有显式设置键,MultiGraph.add_edge()将添加一个带有内部选择键的新边(顺序整数).

In [1]: import networkx as nx

In [2]: G = nx.MultiGraph()

In [3]: G.add_edge(1,2,color='red')

In [4]: G.edges(data=True)
Out[4]: [(1, 2, {'color': 'red'})]

In [5]: G.add_edge(1,2,color='blue')

In [6]: G.edges(data=True)
Out[6]: [(1, 2, {'color': 'red'}), (1, 2, {'color': 'blue'})]

In [7]: G.edges(data=True,keys=True)
Out[7]: [(1, 2, 0, {'color': 'red'}), (1, 2, 1, {'color': 'blue'})]

In [8]: G.add_edge(1,2,key=0,color='blue')

In [9]: G.edges(data=True,keys=True)
Out[9]: [(1, 2, 0, {'color': 'blue'}), (1, 2, 1, {'color': 'blue'})]

In [10]: G[1][2]
Out[10]: {0: {'color': 'blue'}, 1: {'color': 'blue'}}

In [11]: G[1][2][0]['color']='green'

In [12]: G.edges(data=True,keys=True)
Out[12]: [(1, 2, 0, {'color': 'green'}), (1, 2, 1, {'color': 'blue'})]
Run Code Online (Sandbox Code Playgroud)