relabel_nodes#

relabel_nodes(G, mapping, copy=True)[source]#

根据给定的映射重新标记图G的节点。

如果 copyFalse 且映射包含旧标签和新标签的重叠,原始节点顺序可能不会被保留。

Parameters:
G

一个NetworkX图

mapping字典

一个字典,旧标签作为键,新标签作为值。 允许部分映射。允许将两个节点映射到一个节点。 映射中的非节点键将被忽略。

copy布尔值(可选,默认为True)

如果为True,返回一个副本;如果为False,则在原地重新标记节点。

Notes

只有映射中指定的节点会被重新标记。 映射中的非节点键将被忽略。

设置copy=False会原地修改图。 Relabel_nodes通过从 mapping 构建一个有向图来避免命名冲突,该图指定了重新标记的顺序。命名冲突,如a->b, b->c,会被排序,使得”b”在”a”被重命名为”b”之前被重命名为”c”。在循环映射的情况下(例如a->b, b->a),无法原地修改图,并会引发异常。在这种情况下,使用copy=True。

如果多重图上的重新标记操作会导致两条或多条边具有相同的源、目标和键,则第二条边必须被分配一个新键以保留所有边。新键设置为这两个节点之间尚未用作边键的最小非负整数。请注意,这意味着非数字键可能被数字键替换。

Examples

要根据给定的字典创建一个新图并重新标记节点:

>>> G = nx.path_graph(3)
>>> sorted(G)
[0, 1, 2]
>>> mapping = {0: "a", 1: "b", 2: "c"}
>>> H = nx.relabel_nodes(G, mapping)
>>> sorted(H)
['a', 'b', 'c']

节点可以用任何可哈希对象重新标记,包括数字和字符串:

>>> import string
>>> G = nx.path_graph(26)  # 节点是整数0到25
>>> sorted(G)[:3]
[0, 1, 2]
>>> mapping = dict(zip(G, string.ascii_lowercase))
>>> G = nx.relabel_nodes(G, mapping)  # 节点是字符a到z
>>> sorted(G)[:3]
['a', 'b', 'c']
>>> mapping = dict(zip(G, range(1, 27)))
>>> G = nx.relabel_nodes(G, mapping)  # 节点是整数1到26
>>> sorted(G)[:3]
[1, 2, 3]

要执行部分原地重新标记,提供仅包含部分节点的字典映射,并将 copy 关键字参数设置为False:

>>> G = nx.path_graph(3)  # 节点0-1-2
>>> mapping = {0: "a", 1: "b"}  # 0->'a'和1->'b'
>>> G = nx.relabel_nodes(G, mapping, copy=False)
>>> sorted(G, key=str)
[2, 'a', 'b']

映射也可以作为函数提供:

>>> G = nx.path_graph(3)
>>> H = nx.relabel_nodes(G, lambda x: x**2)
>>> list(H)
[0, 1, 4]

在多重图中,将两个或更多节点重新标记为相同的新节点将保留所有边,但在此过程中可能会更改边键:

>>> G = nx.MultiGraph()
>>> G.add_edge(0, 1, value="a")  # 返回此边的键
0
>>> G.add_edge(0, 2, value="b")
0
>>> G.add_edge(0, 3, value="c")
0
>>> mapping = {1: 4, 2: 4, 3: 4}
>>> H = nx.relabel_nodes(G, mapping, copy=True)
>>> print(H[0])
{4: {0: {'value': 'a'}, 1: {'value': 'b'}, 2: {'value': 'c'}}}

这也适用于原地重新标记:

>>> G = nx.relabel_nodes(G, mapping, copy=False)
>>> print(G[0])
{4: {0: {'value': 'a'}, 1: {'value': 'b'}, 2: {'value': 'c'}}}