代码之家  ›  专栏  ›  技术社区  ›  Cyriac Antony

删除networkx中的孤立顶点

  •  18
  • Cyriac Antony  · 技术社区  · 6 年前

    文档中说,可以使用networkx获得图中的孤立顶点。分离物( G ). 它补充说,可以使用代码从图G中删除孤立顶点 G .从(nx.insulates)中删除\u nodes\u( G )).

    https://networkx.github.io/documentation/networkx-1.10/reference/generated/networkx.algorithms.isolate.isolates.html

    screenshot of documentation(url above)

    但当我运行代码时,出现了运行时错误“dictionary changed size during iteration”。

    错误报告:-
    >>> G.remove_nodes_from(nx.isolates(G)) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/home/iiitdm/anaconda2/lib/python2.7/site-packages/networkx/classes/graph.py", line 617, in remove_nodes_from for n in nodes: File "/home/iiitdm/anaconda2/lib/python2.7/site-packages/networkx/algorithms/isolate.py", line 94, in <genexpr> return (n for n, d in G.degree() if d == 0) File "/home/iiitdm/anaconda2/lib/python2.7/site-packages/networkx/classes/reportviews.py", line 443, in __iter__ for n in self._nodes: RuntimeError: dictionary changed size during iteration

    这是可以理解的,也是意料之中的,因为(我认为)使用函数insulates()创建的generator对象会随着G的变化而变化,因此在“迭代”时更改图G应该会产生类似的错误。那么文档中的那一行一定是错的,不是吗?我完全错了吗?我对python很陌生。

    顺便说一下,networkx返回的对象。isolates()是生成器对象。

    非常感谢。

    3 回复  |  直到 6 年前
        1
  •  21
  •   salparadise    6 年前

    我想你是对的,提交一个文档补丁?

    此外,您还可以将生成器强制转换为列表以绕过此问题:

    G.remove_nodes_from(list(nx.isolates(G)))

    但是为什么你的工作是围绕着工作的呢?我不明白;情况没有改变!

    我必须查看他们的代码,但我的直觉是,生成器的懒散性是基于异常消息来对抗它的。

    强制转换为list时,集合在作为参数馈送之前创建,因此在对象迭代时不会产生任何副作用。

    正如@Dyz的回答所指出的,文档是正确的,您使用的是Nx 2.0。

    https://networkx.github.io/documentation/networkx-2.0/reference/algorithms/generated/networkx.algorithms.isolate.isolates.html

    在fed-as-argument行为之前创建的集合是否适用于任何类型的cast(比如dict或set)?

    嗯,不完全(一套就行)dict不会,因为它需要一对物品。 list set 当像函数一样调用时(和dict,但又需要成对调用(元组列表将起作用)),调用 __iter__

    发电机有 __iter__ 这让他们 iterables (+许多其他对象)。生成器非常适合处理各种用例,例如,当您有大量的项集合,并且需要多次循环它们时,它可以节省运行时的复杂性。

    然而,有一些细微差别,比如你遇到了什么,你必须理解一些内部的东西才能正确使用。

        2
  •  4
  •   gdahlm    6 年前

    您正在查看1的文档。使用2时为X。十、 不幸的是,1的搜索引擎排名更高。X文档。

    在networkx 2中。X隔离是生成器对象。

    当前稳定的文档将向示例代码中添加list()。

    https://networkx.github.io/documentation/stable/reference/algorithms/generated/networkx.algorithms.isolate.isolates.html

    In [107]: nx.isolates(G)
    Out[107]: <generator object isolates.<locals>.<genexpr> at 0x7fa499cd8e60>
    

    如果您需要1,迁移指南可能会有所帮助。X行为也是。

    https://networkx.github.io/documentation/stable/release/migration_guide_from_1.x_to_2.0.html

        3
  •  3
  •   DYZ    6 年前

    你弄糊涂了 networkx-2.0 (其中 isolates 返回迭代器)和的文档 networkx-1.10 (其中 分离物 返回列表)。您的代码在 networkx-1.10 . 应用 list 分离物 在2.0中,将情况减少到1.10中存在的情况。