首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何向networkx中的边缘添加新属性?

如何向networkx中的边缘添加新属性?
EN

Stack Overflow用户
提问于 2014-11-01 10:10:54
回答 5查看 35.6K关注 0票数 34

我所拥有的: gml文件加载节点和边的网络中导入的图形G,

Problem:如何向选定的边缘E添加新属性。

我想要做的事情:,我想为我的图形的特定边E添加一个新的属性'type‘。注意:这个边E不存在属性'type‘。

我的代码是:

代码语言:javascript
运行
AI代码解释
复制
  G.edge[id_source][id_target]['type']= value

但是如果我打印G的所有边,现在我就有了n+1边;G的所有旧边,以及一个新的边p= (id_source,id_target,{'type'= value})。此外,旧的边E(我想修改的边)没有新的属性“type”。

所以我的代码添加了一个新的边缘(我不想要)。

--我想更新旧的,添加一个不存在的新属性。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2014-11-01 15:01:55

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

下面是图和MultiGraphs的不同工作方式的示例。

对于图用例属性,如下所示:

代码语言:javascript
运行
AI代码解释
复制
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,有一个额外的键级别来跟踪平行边,所以它的工作方式有点不同。如果没有显式设置键,MultiGraph.add_edge()将使用内部选择的键(顺序整数)添加一个新的边。

代码语言:javascript
运行
AI代码解释
复制
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'})]
票数 26
EN

Stack Overflow用户

发布于 2015-05-08 00:59:00

我不太明白为什么您只想向一个边添加一个属性,相反,您可以向所有边添加一个属性,然后将the wanted value赋予您特定的边。

Networkx有一个名为set_edge_attributes的方法,它可以向所有边缘添加一个边缘属性,例如

代码语言:javascript
运行
AI代码解释
复制
    G = nx.path_graph(3)
    bb = nx.edge_betweenness_centrality(G, normalized=False)
    nx.set_edge_attributes(G, 'betweenness', bb)
    G[1][2]['betweenness']

产出: 2.0

票数 3
EN

Stack Overflow用户

发布于 2019-05-24 10:14:19

下面的答案很有效,请注意,valuesname的参数在Networkxv1.x(最初编写答案时)和Networkxv2.x之间切换。对于v2.x,代码是:

代码语言:javascript
运行
AI代码解释
复制
G = nx.path_graph(3)
bb = nx.edge_betweenness_centrality(G, normalized=False)
nx.set_edge_attributes(G, bb, 'betweenness')
G[1][2]['betweenness']
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26691442

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档