首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >NetworkX DiGraph按节点创建子图(DiGraph)

NetworkX DiGraph按节点创建子图(DiGraph)
EN

Stack Overflow用户
提问于 2015-10-04 16:06:37
回答 3查看 4.8K关注 0票数 8

我想通过节点获得一个子图(红色区域):该子图由所有可从输入节点到达的节点组成。

像G.subgraph(3)一样,从红色区域返回一个新的DiGraph。

例如,我创建一个DiGraph,如下所示:

代码语言:javascript
运行
复制
import networkx as nx
G = nx.DiGraph()

G.add_path([1,2,3,4])
G.add_path([3,'a','b'])

A = nx.to_agraph(G)
A.layout()
A.draw('graph.png')

我查看了https://networkx.github.io/documentation/latest/reference/generated/networkx.Graph.subgraph.html并将其转换为单向的。我测试了out_egdes,强/弱_connected_component,但它从未起作用。我还看上去像How to find subgraphs in a directed graph without converting to undirected graph?Networkx: extract the connected component containing a given node (directed graph)

我知道子图在DiGraph中不起作用。

有人能告诉我怎么做吗?如果生成的图形也是一个DiGraph,那就更好了

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-10-06 13:02:41

根据我的理解,创建子图的标准取决于可以从输入节点到达的节点。然后,下面的递归函数应该足够完成工作。

代码语言:javascript
运行
复制
def create_subgraph(G,sub_G,start_node):
    for n in G.successors_iter(start_node):
        sub_G.add_path([start_node,n])
        create_subgraph(G,sub_G,n)

我复制了您的代码来创建图形,初始化了一个空有向图,并按如下方式调用了该函数:

代码语言:javascript
运行
复制
G = nx.DiGraph()
G.add_path([1,2,3,4])
G.add_path([3,'a','b'])
sub_G = nx.DiGraph()
create_subgraph(G, sub_G,3)

结果的有向图如图所示。

票数 8
EN

Stack Overflow用户

发布于 2017-08-14 16:26:49

使用内建遍历算法可以获得更好的性能,支持双向选择,避免递归深度限制.

代码语言:javascript
运行
复制
def create_subgraph(G, node):
    edges = nx.dfs_successors(G, node)
    nodes = []
    for k,v in edges.items():
        nodes.extend([k])
        nodes.extend(v)
    return G.subgraph(nodes)

或者是统一方向的简明版本:

代码语言:javascript
运行
复制
def create_subgraph(G, node):
    nodes = nx.single_source_shortest_path(G,node).keys()
    return G.subgraph(nodes)

在我的例子中,内建版本比递归版本快3倍。它的子图3000从5000个节点:

代码语言:javascript
运行
复制
In [1]: %timeit -n10 use_built_in('O_CONTRACT_PRODUCT') 
10 loops, best of 3: 102 ms per loop 

In [2]: %timeit -n10 use_recursive('O_CONTRACT_PRODUCT')
10 loops, best of 3: 341 ms per loop

create_subgraph(G,3)的结果如图所示:

票数 4
EN

Stack Overflow用户

发布于 2018-06-13 16:45:39

浅析@vaettchen对How to extract a subgraph from a dot file的神秘评论

  1. 获取gvpr命令文件,从https://gist.github.com/blabber/74b8d9ed59d0b2ad0d7a734113996424#file-reduce-g获取reduce.g
  2. gvpr上运行reduce.g

gvpr -f reduce.g -a '"3" 10' mygraph.dot > myreduced.graph.dot

其中-areduce.g程序的参数,即目标node=3和要遵循的跳数。如果你跳过-a,它就会告诉你。

This script takes exactly two parameter. 1: name of node, 2: number of hops

现在,从它的立场来看,reduce.g确实修改了相当多的图形--我从水平方向切换到垂直方向。

顺便说一句,由于将参数输入到bash脚本中,使我在很大程度上被引号所困扰,所以我添加了一些有用的内容。

gvpr -f reduce.g -a " \"$node_to_select\" 10" mygraph.dot

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32935510

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档