如何向 networkx 中的边缘添加新属性? [英] How do I add a new attribute to an edge in networkx?

查看:95
本文介绍了如何向 networkx 中的边缘添加新属性?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我所拥有的:在 networkx 中导入的图形 G,其节点和边由 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 添加一个新属性类型".注意:此边 E 不存在属性 'type'.

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 的所有边,现在我有 n+1 条边;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'.

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

So my code have added a new edge (that I don't want).

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

I want to update the old one adding a new attribute that doesn't exist.

推荐答案

您可能有一个 networkx MultiGraph 而不是图形,在这种情况下,边的属性设置有点棘手.(您可以通过加载节点之间具有多个边的图来获得多重图).您可能会通过分配属性来破坏数据结构G.edge[id_source][id_target]['type']= value 需要时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.

以下示例说明了图形和多图形的不同工作方式.

Here are examples of how it works differently for Graphs and MultiGraphs.

对于 Graph case 属性的工作方式如下:

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,有一个额外的键来跟踪平行边,因此它的工作方式略有不同.如果您没有明确设置键 MultiGraph.add_edge() 将添加一个带有内部选择键(顺序整数)的新边.

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'})]

这篇关于如何向 networkx 中的边缘添加新属性?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆