[英]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
之前,則表示沒有從v
到u
的路徑(但可能是從u
到v
的路徑)。 如果使用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.