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 的稀疏线性代数后端。