簡體   English   中英

刪除networkx中的孤立頂點

[英]removing isolated vertices in networkx

文檔說明圖中的孤立頂點可以使用networkx.isolates( G )獲得。 它補充說,可以使用代碼G .remove_nodes_from(nx.isolates( G ))從圖G中移除孤立的頂點。

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

文檔截圖(上面的url)

但是當我運行代碼時,我得到運行時錯誤“字典在迭代期間改變了大小”。

錯誤報告:-
>>> 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

這是可以理解的並且是預期的,因為(我認為)使用函數isolates()創建的生成器對象隨G更改,因此在“迭代”時更改圖G應該給出類似的錯誤。 那么文檔中的那一行肯定是錯的,不是嗎? 我完全沒有了嗎? 我對python很新。

順便說一句,networkx.isolates()返回的對象是一個生成器對象。

謝謝

我認為你是對的,提交文件補丁?

您也可以將生成器強制轉換為列表以解決此問題:

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

但為什么你的解決方案工作? 我不明白; 情況沒有改變!

我將不得不看看他們的代碼,但我的預感是生成器的懶惰正在根據異常消息對其進行處理。

轉換為列表,集合在作為參數提供之前創建,因此在迭代時對對象沒有副作用。

從@ Dyz的回答中可以看出,文檔是正確的,您使用的是Nx 2.0。

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

這個集合創建在作為參數行為被提供之前是否適用於任何類型的演員(比如說dict或set)? -

好吧不完全(一套會工作)dict不會因為它想要一對物品。 當像函數一樣被調用時listset (和dict但它又需要對(元組列表將起作用))調用__iter__

生成器有__iter__ ,這使得它們可迭代 (+許多其他對象)。 生成器非常適合處理各種用例,例如,當您擁有大量項目並需要多次循環時,它可以節省運行時的復雜性。

然而,有一些細微差別,比如你遇到了什么,你必須了解一些正確使用的內部。

在使用2.X時,您正在查看1.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

您混淆networkx-2.0isolates返回迭代器)和networkx-1.10文檔( isolates返回列表)。 您的代碼在networkx-1.10 list應用於2.0中的isolates將情況簡化為1.10中存在的情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM