[英]Fetch connected nodes in a NetworkX graph
簡單的問題:我想檢索連接到 NetworkX 圖中給定節點的所有節點,以創建子圖。 在下面顯示的示例中,我只想提取圓圈內的所有節點,並給出其中任何一個的名稱。
我嘗試了以下遞歸函數,但達到了 Python 的遞歸限制,即使這個網絡中只有 91 個節點。
無論下面的代碼是否有問題,完成我想要實現的目標的最佳方法是什么? 我將在各種大小的圖形上運行此代碼,並且事先不知道最大遞歸深度是多少。
def fetch_connected_nodes(node, neighbors_list):
for neighbor in assembly.neighbors(node):
print(neighbor)
if len(assembly.neighbors(neighbor)) == 1:
neighbors_list.append(neighbor)
return neighbors_list
else:
neighbors_list.append(neighbor)
fetch_connected_nodes(neighbor, neighbors_list)
neighbors = []
starting_node = 'NODE_1_length_6578_cov_450.665_ID_16281'
connected_nodes = fetch_connected_nodes(starting_node, neighbors)
假設圖是無向圖,有一個內置的 networkx 命令:
node_connected_component(G, n)
文檔在這里。 它返回包含n
的G
的連通分量中的所有節點。
它不是遞歸的,但我認為您實際上不需要甚至不需要它。
對您的代碼的評論:您有一個錯誤,通常會導致無限遞歸。 如果u
和v
都是度數至少為 2 的鄰居,那么它將以u
開頭,將v
放入列表中,並且在處理v
將u
放入列表中並不斷重復。 它需要更改為僅處理不在neighbors_list
中的neighbors_list
。 檢查它的成本很高,因此請改用一組。 如果起始節點的度數為 1,則還有一個小問題。您對度數 1 的測試不符合您的要求。 如果初始節點的度數為 1,但其鄰居的度數更高,則不會找到鄰居的鄰居。
這是對您的代碼的修改:
def fetch_connected_nodes(G, node, seen = None):
if seen == None:
seen = set([node])
for neighbor in G.neighbors(node):
print(neighbor)
if neighbor not in seen:
seen.add(neighbor)
fetch_connected_nodes(G, neighbor, seen)
return seen
你稱之為fetch_connected_nodes(assembly, starting_node)
。
您可以簡單地使用從給定節點或任何節點開始的廣度優先搜索。
在 Networkx 中,您可以使用以下函數從起始節點獲取樹圖:
bfs_tree(G, source, reverse=False)
這是文檔的鏈接: Network bfs_tree 。
這是一個遞歸算法,用於將所有節點連接到輸入節點。
def create_subgraph(G,sub_G,start_node):
sub_G.add_node(start_node)
for n in G.neighbors_iter(start_node):
if n not in sub_G.neighbors(start_node):
sub_G.add_path([start_node,n])
create_subgraph(G,sub_G,n)
我相信這里防止無限遞歸調用的關鍵是檢查原始圖中的鄰居節點在正在創建的 sub_G 中尚未連接的條件。 否則,您將總是在已經有邊的節點之間來回走動。
我測試如下:
G = nx.erdos_renyi_graph(20,0.08)
nx.draw(G,with_labels = True)
plt.show()
sub_G = nx.Graph()
create_subgraph(G,sub_G,17)
nx.draw(sub_G,with_labels = True)
plt.show()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.