relabel_nodes#
- relabel_nodes(G, mapping, copy=True)[source]#
根据给定的映射重新标记图G的节点。
如果
copy
为False
且映射包含旧标签和新标签的重叠,原始节点顺序可能不会被保留。- Parameters:
- G图
一个NetworkX图
- mapping字典
一个字典,旧标签作为键,新标签作为值。 允许部分映射。允许将两个节点映射到一个节点。 映射中的非节点键将被忽略。
- copy布尔值(可选,默认为True)
如果为True,返回一个副本;如果为False,则在原地重新标记节点。
See also
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'}}}