問題描述
我所擁有的: 在 networkx 中導(dǎo)入的圖 G,其節(jié)點(diǎn)和邊由 gml 文件加載.
What I have: a graph G imported in networkx with nodes and edges loaded by gml file.
問題:如何為選中的邊E添加新屬性.
Problem: How to add a new attribute to a selected edge E.
我想做什么:我想為我的圖表的特定邊 E 添加一個(gè)新屬性類型".注意:該邊 E 不存在類型"屬性.
What I want to do: I want to add a new attribute 'type' for a particular edge E of my graph. Attention: the attribute 'type' doesn't exist for this edge E.
我的代碼是:
G.edge[id_source][id_target]['type']= value
但是如果我打印 G 的所有邊,現(xiàn)在我有 n+1 個(gè)邊;G 的所有舊邊,以及一條新邊 p= (id_source, id_target, {'type'= value}).此外,舊邊 E(我要修改的邊)沒有新屬性type".
But if I print all the edges of G, now I have n+1 edges; all the old edges of G, and a new edge p= (id_source, id_target, {'type'= value}). Furthermore, the old edge E (the one that I want modify) doesn't have the new attribute 'type'.
所以我的代碼添加了一個(gè)新的優(yōu)勢(我不想要).
So my code have added a new edge (that I don't want).
我想更新舊的添加一個(gè)不存在的新屬性.
I want to update the old one adding a new attribute that doesn't exist.
推薦答案
你可能有一個(gè) networkx MultiGraph 而不是一個(gè)圖,在這種情況下,邊的屬性設(shè)置有點(diǎn)棘手.(您可以通過加載節(jié)點(diǎn)之間具有多條邊的圖來獲得多重圖).您可能會(huì)通過分配屬性來破壞數(shù)據(jù)結(jié)構(gòu)G.edge[id_source][id_target]['type']= value
當(dāng)您需要時(shí)G.edge[id_source][id_target][key]['type']= value
.
You may have a networkx MultiGraph instead of a graph and in that case the attribute setting for edges is a little tricker. (You can get a multigraph by loading a graph with more than one edge between nodes). You may be corrupting the data structure by assigning the attribute
G.edge[id_source][id_target]['type']= value
when you need
G.edge[id_source][id_target][key]['type']= value
.
以下是 Graphs 和 MultiGraphs 的不同工作方式示例.
Here are examples of how it works differently for Graphs and MultiGraphs.
對(duì)于 Graph 案例屬性的工作方式如下:
For the Graph case attributes work like this:
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'})]
MultiGraphs 有一個(gè)額外級(jí)別的鍵來跟蹤平行邊,因此它的工作方式略有不同.如果您沒有明確設(shè)置鍵 MultiGraph.add_edge() 將使用內(nèi)部選擇的鍵(順序整數(shù))添加新邊.
With MultiGraphs there is an additional level of keys to keep track of the parallel edges so it works a little differently. If you don't explicitly set a key MultiGraph.add_edge() will add a new edge with an internally chosen key (sequential integers).
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'})]
這篇關(guān)于如何向networkx中的邊緣添加新屬性?的文章就介紹到這了,希望我們推薦的答案對(duì)大家有所幫助,也希望大家多多支持html5模板網(wǎng)!