[英]Retrieve paths from a graph split at nodes with a degree >= 3
當我向圖表添加路徑時:
>>> graph = nx.MultiGraph() # Needs to be MultiGraph/MultiDiGraph.
>>> graph.add_path([1,2,3,4,5])
>>> graph.add_path([2,6,7])
>>> graph.add_path([4,8,9,10,11])
我可以做什么來檢索在度數> = 3的節點上拆分的路徑? 所以我得到:
[[1, 2], [2, 6, 7], [2, 3, 4], [4, 8, 9, 10, 11], [4, 5]]
我假設你事先知道你的路徑。 如果你真的開始使用圖表並希望將其“剝離”到路徑中,請告訴我。 我會建議另一種方法。
這是我想出來的,可能不是最快或最優雅的方式,但它應該工作:
import networkx as nx
graph = nx.MultiGraph()
paths = [[1,2,3,4,5], [2,6,7], [4,8,9,10,11]]
for path in paths:
graph.add_path(path)
splitted_paths = []
# generate list of nodes at which the paths are to be splitted
splitting_nodes = [node for node in graph if graph.degree(node)>=3]
for path in paths:
# find the splitting nodes in the current path
splitting_nodes_in_path = [node for node in splitting_nodes if node in path]
for splitting_node in splitting_nodes_in_path:
# get remaining path up to the current splitting node
path_piece = path[:path.index(splitting_node)+1]
if len(path_piece) > 1:
splitted_paths.append(path_piece)
# overwrite current path with the remaining path
path = path[path.index(splitting_node):]
# get the remaining piece from the last splitting node until the end of the current path
if len(path) > 1:
splitted_paths.append(path)
print splitted_paths
希望這可以幫助!
編輯1:刪除了一個不必要的for循環並添加了一些丟失的代碼行
編輯2:如果您需要從圖表開始,如@marcus評論建議,並希望在給定的路徑列表中有兩個路徑“粘在一起”,如果它們連接沒有度數> = 3的節點,你有使用不同的方法。 我沒有時間完全編寫我的想法來解決這個問題,但這里是我想要嘗試的草圖:
cut(graph, node)
,它接受Networkx圖和nodelabel並逐個node
替換node
( node
)新節點,每個節點連接到一個node
的鄰居(一個人必須想到一個聰明的方法來命名新節點) ,所以最終他們來自哪里清楚) cut()
應用於度> = 3的所有節點,最后得到一個斷開連接的圖,其中每個組件都是所需的分割路徑之一 以下Networkx函數可能對此有用: remove_node()
, remove_node()
subgraph()
。 all_simple_paths()
, predecessor()
和Operators
。
第一:你為什么需要MultiGraph? 根據你的說法,一個簡單的DiGraph就足夠了; 只有在需要兩個不同的連接時才需要MultiGraphs,例如節點4和10,具有不同的屬性。
很多nx函數不適用於MultiGraphs,但如果DiGraphs可以工作,那么你可以嘗試使用weakly_connected_subcomponent_graphs
。 我沒有時間對其進行完全編碼,但這應該是算法:
1-獲取程度> = 3的所有節點(這很容易,並留給讀者練習),以及連接到它的任何節點(前輩+后繼者)。 2-從圖中刪除節點。 這應該只留下度<= 2的節點.3-調用weakly_connected_subcomponent_graphs。 這將返回未相互連接的剩余圖形的林。 4-但是不包括度> = 3的節點; 你需要把它們加回去。 你必須添加節點和邊; 你可以從弱連接的子樹中獲取節點列表,添加連接節點,並向原始圖形詢問子圖,或者自己添加邊。
這應該相當快。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.