如何仅基于out_edges定义NetworkX子图?有向图特定节点子图提取
基于有向图出/入边获取特定节点的ego子图解决方案
NetworkX的nx.ego_graph默认会同时遍历有向图的入边和出边,要实现仅基于出边或入边获取子图,不需要两次调用ego_graph,可以通过以下两种高效方式实现:
方法1:利用ego_graph的neighbors参数自定义遍历规则
nx.ego_graph支持通过neighbors参数指定遍历节点时的邻居获取逻辑,直接适配出边/入边需求:
仅基于出边(out_edges)获取子图
# radius=2 表示遍历深度为2 H_out = nx.ego_graph(G, node_name, radius=2, neighbors=lambda G, n: G.neighbors(n))
G.neighbors(n)会返回节点n通过出边连接的所有后继节点,刚好符合仅走输出边的遍历逻辑。
仅基于入边(in_edges)获取子图
# radius=2 表示遍历深度为2 H_in = nx.ego_graph(G, node_name, radius=2, neighbors=lambda G, n: G.predecessors(n))
G.predecessors(n)返回节点n通过入边连接的所有前驱节点,让ego_graph仅沿着入边方向遍历。
方法2:通过遍历获取可达节点后提取子图
如果更习惯手动控制遍历过程,可以用广度优先(BFS)或深度优先(DFS)遍历指定方向的节点,再从原图中提取子图:
仅基于出边获取子图
# 用BFS遍历出边方向、深度为2的所有节点 out_reachable_nodes = nx.bfs_tree(G, node_name, depth_limit=2).nodes() H_out = G.subgraph(out_reachable_nodes)
仅基于入边获取子图
入边方向的遍历可以先反转图,将入边转为出边后再遍历:
# 反转图,原入边变为出边 G_reversed = G.reverse() in_reachable_nodes = nx.bfs_tree(G_reversed, node_name, depth_limit=2).nodes() H_in = G.subgraph(in_reachable_nodes)
关于你之前代码的问题
直接给H_tmp.out_edges赋值是无效的——NetworkX中图的边集合不能通过这种方式修改,正确的移除出边操作是H_tmp.remove_edges_from(H_tmp.out_edges()),但这种方式不仅效率低,还会破坏图结构,完全没必要。上述两种方法都能更高效地实现你的需求。
内容的提问来源于stack exchange,提问作者Soerendip
相关产品推荐
相关产品推荐

