簡體   English   中英

Python NetworkX從節點作為根在有向圖中找到子圖

[英]Python NetworkX find a subgraph in a Directed Graph from a node as root

我正在編寫代碼以從有向圖提取信息。 該圖也具有周期。 例如,

A->B->C->D
A->E->F->A
B->F->G

從這個圖上,我想創建一個子圖或節點列表,其中輸入是任何節點,輸出將是圖,其中輸入節點是根,或者具有所有節點的節點列表。輸入節點的子節點(直到圖的末尾)

例如,在上面的示例中,1.如果輸入節點為C,則輸出為D。2.如果輸入節點為B,則輸出節點為C,D,F,G,A(由於存在一個循環,使A到B是雙向的)。3.如果輸入為G,則輸出為空白或為空。

python networkx中有什么功能可以用來解決此問題嗎?

或者,是否有其他工具可以幫助我解決此問題?

您想要的是dfs_preorder_nodes()函數。 這是一個基於您的數據的演示:

import networkx as nx

g = nx.DiGraph()

g.add_edge('A', 'B')
g.add_edge('B', 'C')
g.add_edge('C', 'D')

g.add_edge('A', 'E')
g.add_edge('E', 'F')
g.add_edge('F', 'A')

g.add_edge('B', 'F')
g.add_edge('F', 'G')

print('A:', list(nx.dfs_preorder_nodes(g, 'A')))
print('B:', list(nx.dfs_preorder_nodes(g, 'B')))
print('G:', list(nx.dfs_preorder_nodes(g, 'G')))

輸出:

A: ['A', 'B', 'C', 'D', 'F', 'G', 'E']
B: ['B', 'C', 'D', 'F', 'A', 'E', 'G']
G: ['G']

輸出包括起始節點。 因此,如果您不想要它,只需從列表中刪除第一個元素即可。

注意, dfs_preorder_nodes()返回一個生成器對象。 這就是為什么我調用list()以獲得可用的輸出的原因。

nx.ego_graph()完全符合您的描述。 使用@Hai Vu給出的示例:

g = nx.DiGraph()

g.add_edge('A', 'B')
g.add_edge('B', 'C')
g.add_edge('C', 'D')
g.add_edge('A', 'E')
g.add_edge('E', 'F')
g.add_edge('F', 'A')
g.add_edge('B', 'F')
g.add_edge('F', 'G')

a = nx.ego_graph(g, 'A', radius=100)
a.node
#out: NodeView(('A', 'B', 'C', 'D', 'E', 'F', 'G'))

list(nx.ego_graph(g, 'G', radius=100).node)
#out: ['G']

如果您想讓樹中的所有節點直到葉子都出現, radius應該是任意大的數字。

暫無
暫無

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

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