contracted_nodes#

contracted_nodes(G, u, v, self_loops=True, copy=True)[源代码]#

返回收缩节点 uv 后的图。

节点收缩将两个节点视为一个单一节点,该单一节点连接到原先连接这两个节点的所有边。

参数:
GNetworkX 图

将进行节点收缩的图。

u, v节点

必须是 G 中的节点。

self_loops布尔值

如果为 True,则 G 中连接 uv 的任何边在返回的图中将变成新节点的自环。

copy布尔值

如果为 True (默认为 True),则创建 G 的副本并返回,而不是直接修改 G

返回:
NetworkX 图

如果 copy 为 True,返回一个与 G 类型相同的新图对象(不修改 G),其中 uv 被视为单一节点。节点 v 将合并到节点 u 中,因此返回的图中将只包含 u。如果 copy 为 False,则修改 G,其中 uv 被视为单一节点。节点 v 将合并到节点 u 中,因此返回的图中将只包含 u

注意

对于多重图,重新对齐的边的边键可能与旧边的边键不同。这是很自然的,因为边键只在每对节点中唯一。

对于非多重图,如果 uv 都与第三个节点 w 相邻,则边 (v, w) 将被收缩到边 (u, w) 中,其属性存储在“contraction”属性里。

此函数也可通过 identified_nodes 访问。

示例

收缩四节点环图 C_4 的两个不相邻节点,得到路径图(忽略并行边)

>>> G = nx.cycle_graph(4)
>>> M = nx.contracted_nodes(G, 1, 3)
>>> P3 = nx.path_graph(3)
>>> nx.is_isomorphic(M, P3)
True
>>> G = nx.MultiGraph(P3)
>>> M = nx.contracted_nodes(G, 0, 2)
>>> M.edges
MultiEdgeView([(0, 1, 0), (0, 1, 1)])
>>> G = nx.Graph([(1, 2), (2, 2)])
>>> H = nx.contracted_nodes(G, 1, 2, self_loops=False)
>>> list(H.nodes())
[1]
>>> list(H.edges())
[(1, 1)]

在带有自环的 MultiDiGraph 中,入边和出边将分别作为边处理,因此在收缩带有自环的节点时,收缩将添加多条边

>>> G = nx.MultiDiGraph([(1, 2), (2, 2)])
>>> H = nx.contracted_nodes(G, 1, 2)
>>> list(H.edges())  # edge 1->2, 2->2, 2<-2 from the original Graph G
[(1, 1), (1, 1), (1, 1)]
>>> H = nx.contracted_nodes(G, 1, 2, self_loops=False)
>>> list(H.edges())  # edge 2->2, 2<-2 from the original Graph G
[(1, 1), (1, 1)]