获取包含一定数量节点的networkx子图

Get networkx subgraph containing a certain number of nodes

我有一个networkx有向图,我想提取包含一定数量节点的子图。 例如,有向字母是 0-1-2-3-4-5。我想获取所有包含 3 个节点的子图。结果应为:0-1-2、1-2-3、2-3-4、3-4-5。 我该怎么做?

我不确定我是否理解正确:你的例子暗示你只想要 connected 子图?在有向图中,存在不止一种连通性(弱和强)。所以你必须决定你要找哪一个。

这可能有效:

import networkx as nx
from itertools import combinations

# The graph in your example (as I understand it)
G = nx.DiGraph((i, i+1) for i in range(5))

num_of_nodes = 3 # Number of nodes in the subgraphs (here 3, as in your example)
subgraphs = [] # List for collecting the required subgraphs
for nodes in combinations(G.nodes, num_of_nodes):
    G_sub = G.subgraph(nodes) # Create subgraph induced by nodes
    # Check for weak connectivity
    if nx.is_weakly_connected(G_sub):
        subgraphs.append(G_sub)

combinations(G.nodes, num_of_nodes) 遍历来自 G.

num_of_nodes 个节点的所有唯一组合

所选的子图正是您提到的子图:

print([H.nodes for H in subgraphs])
print([H.edges for H in subgraphs])

显示

[NodeView((0, 1, 2)), NodeView((1, 2, 3)), NodeView((2, 3, 4)), NodeView((3, 4, 5))]
[OutEdgeView([(0, 1), (1, 2)]), OutEdgeView([(1, 2), (2, 3)]), OutEdgeView([(2, 3), (3, 4)]), OutEdgeView([(3, 4), (4, 5)])]

如果你的图表是

G = nx.DiGraph([(i, i+1) for i in range(5)] + [(i+1, i) for i in range(5)])

并且您正在寻找强大的连接性,那么您必须使用

...
    # Check for strong connectivity
    if nx.is_strongly_connected(G_sub):
        ...

(通常的警告:G.subgraph() 只给你一个视图。)