compose#

compose(G, H)[source]#

将图G和H组合成一个单一的图,合并节点和边。

节点集和边集不需要是互斥的。

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

Parameters:
G, H

一个NetworkX图

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

Notes

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

对于MultiGraphs,边由相邻节点和边键标识。这可能导致意外情况(例如,边 (1, 2) 在两个图中可能相同也可能不同),如果你使用MultiGraph而不跟踪边键。

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

Examples

>>> 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 的属性。如果你希望以其他方式合并属性,可以在组合操作后更新它们:

>>> 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

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

>>> 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

Additional backends implement this function

graphblas : OpenMP-enabled sparse linear algebra backend.