gpt4 book ai didi

python - 组合(加入)networkx Graphs

转载 作者:IT老高 更新时间:2023-10-28 20:43:42 24 4
gpt4 key购买 nike

假设我有两个networkx图,GH:

G=nx.Graph()
fromnodes=[0,1,1,1,1,1,2]
tonodes=[1,2,3,4,5,6,7]
for x,y in zip(fromnodes,tonodes):
G.add_edge(x,y)

H=nx.Graph()
fromnodes=range(2,8)
tonodes=range(8,14)
for x,y in zip(fromnodes,tonodes):
H.add_edge(x,y)

加入两个networkx图的最佳方法是什么?

我想保留节点名称(注意公共(public)节点,2 到 7)。当我使用 nx.disjoint_union(G,H) 时,这并没有发生:

>>> G.nodes()
[0, 1, 2, 3, 4, 5, 6, 7]
>>> H.nodes()
[2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
>>> Un= nx.disjoint_union(G,H)
>>> Un.nodes()
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
#

H 节点标签已更改(不是我想要的)。我想在具有相同编号的节点处加入图表。

注意。这不是 Combine two weighted graphs in NetworkX 的副本

最佳答案

您要查找的函数是compose ,它生成一个图,其中包含两个图中的所有边和所有节点。如果两个图都有一个同名的节点,那么一个副本最终会出现在新图中。同样,如果两者都存在相同的边缘。这是一个示例,包括边缘/节点属性:

import networkx as nx

G=nx.Graph()
G.add_node(1, weight = 2)
G.add_node(2, weight = 3)
G.add_edge(1,2, flux = 5)
G.add_edge(2,4)

H=nx.Graph()
H.add_node(1, weight = 4)
H.add_edge(1,2, flux = 10)
H.add_edge(1,3)

F = nx.compose(G,H)
#F has all nodes & edges of both graphs, including attributes
#Where the attributes conflict, it uses the attributes of H.

G.nodes(data=True)
> NodeDataView({1: {'weight': 2}, 2: {'weight': 3}, 4: {}})
H.nodes(data=True)
> NodeDataView({1: {'weight': 4}, 2: {}, 3: {}})
F.nodes(data=True)
> NodeDataView({1: {'weight': 4}, 2: {'weight': 3}, 4: {}, 3: {}})

G.edges(data=True)
> EdgeDataView([(1, 2, {'flux': 5}), (2, 4, {})])
H.edges(data=True)
> EdgeDataView([(1, 2, {'flux': 10}), (1, 3, {})])
F.edges(data=True)
EdgeDataView([(1, 2, {'flux': 10}), (1, 3, {}), (2, 4, {})])

这些保留属性,但显然如果存在冲突,这是不可能的。 H 的属性优先。

还有其他选项可以执行 symmetric difference, intersection , ...

如果您有多个图表要连接在一起,您可以使用 compose_all ,它只是围绕 compose 包装了一个 for 循环。

关于python - 组合(加入)networkx Graphs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32652149/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com