从连接的组件列表生成图形
Generate graph from a list of connected components
设置
让我们假设以下无向图:
import networkx as nx
G = nx.from_edgelist([(0, 3), (0, 1), (2, 5), (0, 3)])
G.add_nodes_from(range(7))
甚至添加 (1, 3) 边(这里无关紧要):
连接的组件是:
list(nx.connected_components(G))
# [{0, 1, 3}, {2, 5}, {4}, {6}]
问题
是否可以直接使用 networkx
从连通分量列表生成图 G
?还是用简单的方法?
到目前为止我找到的唯一解决方案是生成连续的边或每组节点的所有组合并将其提供给 nx.from_edgelist
, then to add the single nodes with add_nodes_from
:
from itertools import pairwise, chain
l = [{0, 1, 3}, {2, 5}, {4}, {6}]
G = nx.from_edgelist(chain.from_iterable(pairwise(e) for e in l))
G.add_nodes_from(set.union(*l))
或所有边:
from itertools import combinations, chain
l = [{0, 1, 3}, {2, 5}, {4}, {6}]
G = nx.from_edgelist(chain.from_iterable(combinations(e, 2) for e in l))
G.add_nodes_from(set.union(*l))
itertools.pairwise
的替代方法是 networkx.path_graph
。
itertools.combinations
的替代方法是 networkx.complete_graph
。
这两个 networkx 函数 return 一个新图,而不是边列表,因此您可以将它们与 networkx.compose_all
组合。
另请注意 union_all
and disjoint_union_all
作为 compose_all
的替代方法。
import networkx as nx
l = [{0, 1, 3}, {2, 5}, {4}, {6}]
G = nx.compose_all(map(nx.path_graph, l))
H = nx.compose_all(map(nx.complete_graph, l))
print(G.nodes, G.edges)
# [0, 1, 3, 2, 5, 4, 6] [(0, 1), (1, 3), (2, 5)]
print(H.nodes, H.edges)
# [0, 1, 3, 2, 5, 4, 6] [(0, 1), (0, 3), (1, 3), (2, 5)]
我实际上没有 运行 基准测试,但我怀疑创建多个图形并组合它们可能比创建边缘列表并将它们链接起来仅创建一个图形要慢。
设置
让我们假设以下无向图:
import networkx as nx
G = nx.from_edgelist([(0, 3), (0, 1), (2, 5), (0, 3)])
G.add_nodes_from(range(7))
甚至添加 (1, 3) 边(这里无关紧要):
连接的组件是:
list(nx.connected_components(G))
# [{0, 1, 3}, {2, 5}, {4}, {6}]
问题
是否可以直接使用 networkx
从连通分量列表生成图 G
?还是用简单的方法?
到目前为止我找到的唯一解决方案是生成连续的边或每组节点的所有组合并将其提供给 nx.from_edgelist
, then to add the single nodes with add_nodes_from
:
from itertools import pairwise, chain
l = [{0, 1, 3}, {2, 5}, {4}, {6}]
G = nx.from_edgelist(chain.from_iterable(pairwise(e) for e in l))
G.add_nodes_from(set.union(*l))
或所有边:
from itertools import combinations, chain
l = [{0, 1, 3}, {2, 5}, {4}, {6}]
G = nx.from_edgelist(chain.from_iterable(combinations(e, 2) for e in l))
G.add_nodes_from(set.union(*l))
itertools.pairwise
的替代方法是 networkx.path_graph
。
itertools.combinations
的替代方法是 networkx.complete_graph
。
这两个 networkx 函数 return 一个新图,而不是边列表,因此您可以将它们与 networkx.compose_all
组合。
另请注意 union_all
and disjoint_union_all
作为 compose_all
的替代方法。
import networkx as nx
l = [{0, 1, 3}, {2, 5}, {4}, {6}]
G = nx.compose_all(map(nx.path_graph, l))
H = nx.compose_all(map(nx.complete_graph, l))
print(G.nodes, G.edges)
# [0, 1, 3, 2, 5, 4, 6] [(0, 1), (1, 3), (2, 5)]
print(H.nodes, H.edges)
# [0, 1, 3, 2, 5, 4, 6] [(0, 1), (0, 3), (1, 3), (2, 5)]
我实际上没有 运行 基准测试,但我怀疑创建多个图形并组合它们可能比创建边缘列表并将它们链接起来仅创建一个图形要慢。