在径向(树)networkx图中查找端节点(叶节点)
Find end nodes (leaf nodes) in radial (tree) networkx graph
给定下图,有没有方便的方法只获取端节点?
我所说的端节点是指那些具有一个连接边的到节点。我认为这些有时被称为叶节点。
G=nx.DiGraph()
fromnodes=[0,1,1,1,1,1,2,3,4,5,5,5,7,8,9,10]
tonodes=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]
for x,y in zip(fromnodes,tonodes):
G.add_edge(x,y)
G.add_node(17) # isolated node
nx.draw_shell(G)
在此示例中,它将是 [6,11,12,13,14,15,16]
为确保定义清晰:我假设您正在寻找出度为 0 入度为 1 的所有节点。这就是我的计算结果。
我正在编辑原始答案,因为 networkx 2.0 没有 nodes_iter()。
参见 networkx migration guide 将 1.x 代码转换为 2.0 代码的一般信息。
for networkx 2.0
如果你想要一个列表
[x for x in G.nodes() if G.out_degree(x)==0 and G.in_degree(x)==1]
如果你更喜欢发电机
(x for x in G.nodes() if G.out_degree(x)==0 and G.in_degree(x)==1)
这在 networkx 1.x 中也有效,但效率较低,因为 G.nodes()
在 1.x 中创建了一个列表。
for networkx 1.x
如果你想要一个列表
[x for x in G.nodes_iter() if G.out_degree(x)==0 and G.in_degree(x)==1]
如果你更喜欢发电机
(x for x in G.nodes_iter() if G.out_degree(x)==0 and G.in_degree(x)==1)
还有一个注意事项 - 如果您在使用生成器时修改 G
,行为不太可能是您想要的。
给定下图,有没有方便的方法只获取端节点?
我所说的端节点是指那些具有一个连接边的到节点。我认为这些有时被称为叶节点。
G=nx.DiGraph()
fromnodes=[0,1,1,1,1,1,2,3,4,5,5,5,7,8,9,10]
tonodes=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]
for x,y in zip(fromnodes,tonodes):
G.add_edge(x,y)
G.add_node(17) # isolated node
nx.draw_shell(G)
在此示例中,它将是 [6,11,12,13,14,15,16]
为确保定义清晰:我假设您正在寻找出度为 0 入度为 1 的所有节点。这就是我的计算结果。
我正在编辑原始答案,因为 networkx 2.0 没有 nodes_iter()。 参见 networkx migration guide 将 1.x 代码转换为 2.0 代码的一般信息。
for networkx 2.0
如果你想要一个列表
[x for x in G.nodes() if G.out_degree(x)==0 and G.in_degree(x)==1]
如果你更喜欢发电机
(x for x in G.nodes() if G.out_degree(x)==0 and G.in_degree(x)==1)
这在 networkx 1.x 中也有效,但效率较低,因为 G.nodes()
在 1.x 中创建了一个列表。
for networkx 1.x
如果你想要一个列表
[x for x in G.nodes_iter() if G.out_degree(x)==0 and G.in_degree(x)==1]
如果你更喜欢发电机
(x for x in G.nodes_iter() if G.out_degree(x)==0 and G.in_degree(x)==1)
还有一个注意事项 - 如果您在使用生成器时修改 G
,行为不太可能是您想要的。