Python NetworkX以节点为根在节点图中查找子图

问题描述 投票:2回答:2

我正在编写一个代码来从有向图中提取信息。该图也有周期。例如,

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中是否有任何功能,我可以用来解决这个问题?

或者,还有其他工具可以帮助我解决这个问题吗?

python graph networkx directed-graph
2个回答
2
投票

你想要的是功能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()以获得可用的输出。


1
投票

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应该是一个任意大的数字,如果你想得到树中的所有节点直到叶子。

© www.soinside.com 2019 - 2024. All rights reserved.