【问题标题】:Find end nodes (leaf nodes) in radial (tree) networkx graph在径向(树)networkx图中查找端节点(叶节点)
【发布时间】:2018-01-08 05:15:29
【问题描述】:

鉴于下图,有没有一种方便的方法可以只获取端节点?

端节点是指具有一个连接边的那些到节点。我认为这些有时被称为叶节点。

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]

【问题讨论】:

  • 任何不在fromnodes 中的节点都将是结束节点,不是吗?
  • 我已经给出了答案,但有些模棱两可。你能阅读我的回答,然后澄清你的问题吗?这样我就可以从我的答案中删除无关的东西。 - 谢谢
  • @JohnPirie 几乎 - 我的问题是模棱两可的,因为它遗漏了一个从节点。我已经更新以使其更清晰。
  • @Joel 你是对的,谢谢。我已经更新了。

标签: python graph-theory networkx


【解决方案1】:

为了确保定义清晰:我假设您正在寻找所有出度为 0 和入度为 1 的节点。这是我的计算结果。

我正在编辑原始答案,因为 networkx 2.0 没有 nodes_iter()。 有关将 1.x 代码转换为 2.0 代码的一般信息,请参阅 networkx migration guide

适用于 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 中创建了一个列表。

适用于 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,则行为不太可能是您想要的。

【讨论】:

  • 对于更通用的叶节点定义,我建议 in_degree > 1。我们希望节点连接到图,但叶节点可能有多个父节点。
  • 我想这样做,但我收到以下错误消息:'Graph' object has no attribute 'out_degree'。 networkx 有变化吗?
  • @Takver - 你已经定义了一个无向图(Graph)。在无向图中,您有一个度数,而不是一个单独的进出度数。要定义out_degree,它需要是DiGraph。所以要么把它变成一个有向图(如果合适的话),或者切换到G.degree(x)==1
  • 转换为有向图(使用G.to_directed())会导致两条边连接每对节点。所以 out_degree 将为 1 而 in_degree 将 >=2 正确吗?是否可以转换为每对节点之间只有一条边的有向图?
  • 在转换为有向图之前,我们需要问你为什么要这样做?除非您的图表真的应该是定向的,否则我认为将其转换为定向的以便您可以尝试一些算法是不明智的。您访问此页面时的目标是什么?
猜你喜欢
  • 2010-09-17
  • 1970-01-01
  • 2019-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-16
  • 1970-01-01
相关资源
最近更新 更多