compose#

compose(G, H)[source]#

通过将节点和边合并到单个图中来组合图 G 和 H。

节点集和边集不需要是不相交的。

组合保留节点和边的属性。H 中的属性值优先于 G 中的属性值。

参数:
G, H

一个 NetworkX 图

返回:
C: 一个与 G 类型相同的新图

注意

建议 G 和 H 要么都是有向图,要么都是无向图。

对于 MultiGraphs,边由关联节点和边键标识。如果您在使用 MultiGraph 时没有跟踪边键,这可能会导致意外(即,边 (1, 2) 在两个图中可能相同也可能不同)。

如果不希望组合共同节点的属性,请考虑使用 union(),它会在名称冲突时引发异常。

示例

>>> G = nx.Graph([(0, 1), (0, 2)])
>>> H = nx.Graph([(0, 1), (1, 2)])
>>> R = nx.compose(G, H)
>>> R.nodes
NodeView((0, 1, 2))
>>> R.edges
EdgeView([(0, 1), (0, 2), (1, 2)])

默认情况下,H 中的属性优先于 G 中的属性。如果您喜欢另一种组合属性的方式,可以在 compose 操作后更新它们。

>>> G = nx.Graph([(0, 1, {"weight": 2.0}), (3, 0, {"weight": 100.0})])
>>> H = nx.Graph([(0, 1, {"weight": 10.0}), (1, 2, {"weight": -1.0})])
>>> nx.set_node_attributes(G, {0: "dark", 1: "light", 3: "black"}, name="color")
>>> nx.set_node_attributes(H, {0: "green", 1: "orange", 2: "yellow"}, name="color")
>>> GcomposeH = nx.compose(G, H)

通常,GcomposeH 的节点颜色属性值来自 H。我们可以通过以下方法解决此问题:

>>> node_data = {
...     n: G.nodes[n]["color"] + " " + H.nodes[n]["color"]
...     for n in G.nodes & H.nodes
... }
>>> nx.set_node_attributes(GcomposeH, node_data, "color")
>>> print(GcomposeH.nodes[0]["color"])
dark green
>>> print(GcomposeH.nodes[3]["color"])
black

类似地,我们可以在 compose 操作后以我们喜欢的方式更新边属性。

>>> edge_data = {
...     e: G.edges[e]["weight"] * H.edges[e]["weight"] for e in G.edges & H.edges
... }
>>> nx.set_edge_attributes(GcomposeH, edge_data, "weight")
>>> print(GcomposeH.edges[(0, 1)]["weight"])
20.0
>>> print(GcomposeH.edges[(3, 0)]["weight"])
100.0
----

其他后端实现了此函数

graphblas : 支持 OpenMP 的稀疏线性代数后端。