networkx:识别一个节点既是另一个节点的祖先又是后代的实例

问题描述 投票:0回答:1

我不确定是否存在具体术语,但我正在寻找有向网络中的路径,在这种情况下方向性是双向的。我正在使用一堆提供的数据构建一个网络,并且偶然发现了一些工件,其中节点 A 和 B 都是彼此的父级/子级。

在寻找识别这些的过程中,我偶然发现了术语“自循环”。这就是我想要的,只是对于比单边长的路径。

import networkx as nx
g = nx.DiGraph()
g.add_edges_from([(0, 1), (0, 2), (0, 3), (1, 3), (3, 0), (3, 3), (2, 0), (1, 2), (2, 1)])
nx.draw_networkx(g, arrows=True, with_labels=True, width=0.2, edge_color='#AAAAAA', arrowsize=20,
                     node_size=2)

enter image description here

networkx
有一个函数可以识别有自环的节点,但我只得到节点3。

list(nx.nodes_with_selfloops(g))
[3]

仅识别节点

3
,但在本例中,我希望识别 1/2 和 0/1 具有双向箭头。它不是单边自循环,但允许 2 > 0 > 1 > 2 和 1 > 3 > 0 > 2 > 1。我在同一个节点开始和结束,中间有其他节点。

有没有一种有效的方法来识别“哪些节点具有指向同一节点的双向箭头”?我还没有识别出足够多的这些情况,无法知道原因是否始终是单个双面箭头或类似 2 个以上多边路径以同一节点开始/停止的情况。

现实世界的数据就像流程一样,因此不应该出现 A 流向 B 而 B 也流入 A 的情况,因此这些是我希望快速识别的数据不一致之处。

python networkx digraphs
1个回答
0
投票

一种简单的方法是

reverse
边缘并计算一组交集:

g.edges & nx.reverse(g).edges

输出:

{(0, 2), (0, 3), (1, 2), (2, 0), (2, 1), (3, 0), (3, 3)}
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.