在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:如何在图形中显示节点和边属性

改进 Python NetworkX 图形布局

是否可以在删除节点的同时在 networkX 中为图形设置动画?

在 scikit learn using networkX 中使用二维数据点形成图形

使用 networkX 和 matplotlib 绘制一个巨大的图形

什么可能导致 NetworkX 和 PyGraphViz 单独工作但不能一起工作?