NetworkX最大组件不再工作?

13

根据 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,不确定)

现在我正在使用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]

看起来当节点名称是大数字,且存在许多单个节点时,返回的子图未能正确排序


在我的机器上,使用NetworkX 1.9,你的示例中的组件按大小顺序(从大到小)返回。这与文档相符,文档中说组件将按大小降序返回。 - mdml
另外:如果您想将生成器转换为“列表”,只需调用list,例如list(nx.connected_components(G))。 如果您只想要生成器产生的第一个元素,则可以使用next,例如next(nx.connected_components(G)) - DSM
谢谢@DSM!我在这里找到了如何从生成器中获取元素的方法。http://stackoverflow.com/questions/12556090/how-can-i-cannot-index-into-the-values-list-of-reduce - sophiadw
@sophiadw:你帖子中的例子对我也完美地起作用。 - mdml
顺便问一下,当使用 nx.connected_component_subgraphs(G)[0] 时,你是否收到错误消息? - sophiadw
显示剩余2条评论
2个回答

19

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.9中,排序功能被去除了。 - sophiadw
是的,连接组件函数现在不再返回列表或已排序的列表。更改在此处有文档记录 http://networkx.github.io/documentation/networkx-1.9/reference/api_1.9.html#miscellaneous-changes - Aric
刚遇到这个问题。我期望得到实际的组件(可以立即访问),而不是“生成器”。必须通过 sorted 进行操作相当不直观,所以感谢您的答案。 - Agostino
еҰӮжһңжӮЁеҸӘжғіиҰҒжңҖеӨ§зҡ„组件пјҢеҲҷhttps://dev59.com/questions/MF8e5IYBdhLWcg3wFnPm#26105849жҸҗдҫӣдәҶдёҖз§Қжӣҙжңүж•Ҳзҡ„ж–№жі•пјҡе°Ҷ`sorted(..., reverse=True)жӣҝжҚўдёәmax(...)гҖӮ max()иҝҳеёҰжңүдёҖдёӘkeyе…ій”®еӯ—еҸӮж•°пјҢжӮЁеҸҜд»Ҙе°Ҷе…¶дҝқз•ҷдёәlen`гҖӮ - Nick T

6
关于2.4版本: 已删除nx.connected_component_subgraphs(G)。 取而代之,使用以下代码获得相同结果:
connected_subgraphs = [G.subgraph(cc) for cc in nx.connected_components(G)]

获取巨型组件:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接