NetworkX最大的组件不再工作?

时间:2014-06-23 20:18:00

标签: python networkx

根据networkx文档,connected_component_subgraphs(G)返回所有组件的排序列表。因此,第一个应该是最大的组成部分。

但是,当我尝试使用文档页面上的示例代码获取图G的最大组件时

G=nx.path_graph(4)
G.add_edge(5,6)
H=nx.connected_component_subgraphs(G)[0]

我得到了

TypeError: 'generator' object has no attribute '__getitem__'

它曾经在我的其他计算机上使用早期版本的networkx(1.7我想,不是100%肯定)

现在我使用的是另一台配备python 2.7.7和networkx 1.9的计算机。这是版本问题吗?

我自己编写了一个带有几行的小函数来找到最大的组件,只是想知道为什么会出现这个错误。

顺便说一句,我可以通过将生成器对象转换为列表来获取组件。

components = [comp for comp in nx.connected_components(G)]

但是列表没有按文档中所述的组件大小排序。

示例:

G = nx.Graph()
G.add_edges_from([(1,2),(1,3),(4,5)])
G.add_nodes_from(range(6,20))
components = [comp for comp in nx.connected_components(G)]
component_size = [len(comp) for comp in components]
print G.number_of_nodes(), G.number_of_edges(), component_size

G = nx.Graph()
G.add_edges_from([(1000,2000),(1000,3000),(4000,5000)])
G.add_nodes_from(range(6,20))
components = [comp for comp in nx.connected_components(G)]
component_size = [len(comp) for comp in components]
print G.number_of_nodes(), G.number_of_edges(), component_size

输出:

19 3 [3, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
19 3 [2, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]

看起来当节点名称是大数字并且有一堆单个节点时,返回的子图未正确排序

2 个答案:

答案 0 :(得分:15)

networkx-1.9文档在http://networkx.github.io/documentation/networkx-1.9/reference/generated/networkx.algorithms.components.connected.connected_components.html#networkx.algorithms.components.connected.connected_components

接口已更改为返回生成器(如您所知)。文档中的示例显示了如何执行您的要求。

生成已连接组件的排序列表,最大值。

>> G = nx.path_graph(4)
>>> G.add_path([10, 11, 12])
>>> sorted(nx.connected_components(G), key = len, reverse=True)
[[0, 1, 2, 3], [10, 11, 12]]

>>> sorted(nx.connected_component_subgraphs(G), key = len, reverse=True)

答案 1 :(得分:0)

对于版本2.4: nx.connected_component_subgraphs(G)已删除。

相反,要获得相同的结果,请使用:

[G.subgraph(cc) for cc in nx.connected_components(G)]

并获得巨型组件:

Gcc = max(nx.connected_components(G), key=len)
giantC = G.subgraph(Gcc)