在networkx中的图形对象中查找单独的图形
Posted
技术标签:
【中文标题】在networkx中的图形对象中查找单独的图形【英文标题】:Finding separate graphs within a graph object in networkx 【发布时间】:2014-03-11 11:10:10 【问题描述】:我有一个巨大的图形数据集 - 假设它是这样的,但在更大的层面上:
1 -> 2
3 -> 4
1,2,3,4 是节点,箭头是有向边。假设它们都在一个图形对象中:
import networkx as nx
G = nx.DiGraph()
G.add_nodes_from([1,2,3,4])
G.add_edge(1,2)
G.add_edge(3,4)
给定一个像这样的对象,它在一个图中有两个迷你图,我们如何提取每个迷你图? 我觉得这一定有什么说法吗? 我的最终结果如下:
for mini_graph in G:
print mini_graph.nodes()
...
[1,2]
[3,4]
【问题讨论】:
我认为您可以使用weakly_connected_component_subgraphs
,如果是这样,则与此重复:***.com/questions/18643789/…
也相关:***.com/questions/13914920/…。这取决于你如何在这里定义子图
【参考方案1】:
如果图的各个部分确实不相交(根据您的小示例),则考虑使用connected_component_subgraphs()
提取子图。
这仅适用于无向图,因此如果您使用有向图,则需要先转换为无向图。
import networkx as nx
G = nx.DiGraph()
G.add_nodes_from([1,2,3,4])
G.add_edge(1,2)
G.add_edge(3,4)
# make an undirected copy of the digraph
UG = G.to_undirected()
# extract subgraphs
sub_graphs = nx.connected_component_subgraphs(UG)
for i, sg in enumerate(sub_graphs):
print "subgraph has nodes".format(i, sg.number_of_nodes())
print "\tNodes:", sg.nodes(data=True)
print "\tEdges:", sg.edges()
产生:
subgraph 1 has 2 nodes
Nodes: [(1, ), (2, )]
Edges: [(1, 2)]
subgraph 1 has 2 nodes
Nodes: [(3, ), (4, )]
Edges: [(3, 4)]
您可以使用子图节点标签对初始图中的数据进行操作,
sg.nodes()[0] in G
>>> True
阅读 EdChum 链接的答案,weakly_connected_component_subgraphs()
似乎在有向图上运行,但将其视为无向图,因此保存副本可能至关重要。但是,目前关于这个和相关函数weakly_connected_components()
的文档有点薄。
【讨论】:
【参考方案2】:截至 2018 年,上述答案已弃用 (link to docs)。建议您使用:
(G.subgraph(c) for c in connected_components(G))
或
(G.subgraph(c).copy() for c in connected_components(G))
【讨论】:
【参考方案3】:由于之前的答案是针对无向图做出的,由于转换为无向图,我们将丢失方向的重要信息。我也遇到了同样的问题,最后weakly_connected_components方法做到了。
>>> G = nx.DiGraph()
>>> G.add_nodes_from([1,2,3,4])
>>> G.add_edge(1,2)
>>> G.add_edge(3,4)
>>> list(nx.weakly_connected_components(G))
[1, 2, 3, 4]
它适用于有向图,其性能相当不错。如果你喜欢分割你的图并继续计算(像我一样),那么你也可以构建上面结果的子图:
h = nx.weakly_connected_component_subgraphs(G)
j = []
for foo in h:
j.append(foo)
(非常明确,以显示如何访问它)。不管是什么原因,h 似乎被它列出来毁掉了?!上面的方式反而是稳定的。
【讨论】:
以上是关于在networkx中的图形对象中查找单独的图形的主要内容,如果未能解决你的问题,请参考以下文章
是否可以在删除节点的同时在 networkX 中为图形设置动画?
在 scikit learn using networkX 中使用二维数据点形成图形