簡體   English   中英

在有向無環網絡的組件中獲得有序節點x DiGraph

[英]get ordered nodes in components of directed acyclic networkx DiGraph

我有一個帶有子圖的有向圖,其中節點的順序很重要。

示例我的圖將有兩個子圖,所有線性1-->2-->3 & 9-->8-->7-->6

注意:節點名稱將是隨機且唯一的,圖中沒有循環

NG = nx.DiGraph()
NG.add_edges_from([(1,2),(2,3)])
NG.add_edges_from([(9,8),(8,7),(7,6)])

我需要獲取子圖中的子圖或節點列表,其中節點根據其連接進行排序。

我試過了

[i.nodes() for i in list(nx.weakly_connected_component_subgraphs(NG))]

導致節點列表的列表,幾乎是正確的,但沒有根據它們的連接排序:

[[1, 2, 3], [8, 9, 6, 7]]

我如何才能獲得有序節點列表的列表。 即:

[[1, 2, 3], [9, 8, 7, 6]]

我假設你確定這些是“有向無環圖”。

然后nx.topological_sort(G)根據您想要的順序對圖中的節點進行排序:也就是說,如果u出現在v之前,則表示沒有從vu的路徑(但可能是從uv的路徑)。 如果使用nx.weakly_connected_component_subgraphs(G)你會得到一個你感興趣的子圖的生成器。所以我建議的方法是首先找到子圖然后對節點進行排序。

[nx.topological_sort(H) for H in nx.weakly_connected_component_subgraphs(NG)]

應該得到你想要的。


另一種更有效的方法:

以前的代碼不是最有效的代碼,但很簡單。 創建每個子圖H需要時間,可以避免。 一個更有效的方法是做weakly_connected_components(NG) (它生成每個子圖中的節點列表而不是子圖本身)。 這將創建像您一樣的列表。 然后你做拓撲排序:

[nx.topological_sort(NG, nbunch=subgraph_nodes) for subgraph_nodes in nx.weakly_connected_components(NG)]

這樣會更有效率。 它的作用首先是它生成每個組件中的節點列表。 然后,它將對每個組件中的節點進行排序。 如果你這樣做,你應該看一下topological_sort來源 它將返回所有節點的排序列表,這些節點可以從它nbunch任何節點nbunch 在你的情況下,這只是nbunch ,但更普遍的是它不僅僅需要返回nbunch


注意:在您的代碼中不需要list(...) 沒有它你會得到相同的結果。

暫無
暫無

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

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