networkx图中不存在的边列表?

时间:2014-08-06 11:43:09

标签: python graph networkx

我有networkx图表。使用G.edges(),我可以获得所有边缘的列表。但有没有办法获得所有其他不存在的边的列表?因此,如果有3个节点:a,b,c,我们假设a和b只是连接,那么我想得到一个不存在的边列表,如下所示:(a,c), (c,b)。有一种简单的pythonic方法吗?

3 个答案:

答案 0 :(得分:5)

在网络x 1.9中实际上有一个名为non_edges的新功能,仅用于此目的:

import networkx as nx
G = nx.MultiGraph()
G.add_edges_from([('A', 'B'), ('B', 'C')])
list(nx.non_edges(G))

Out[3]:
[('A', 'C')]

由于list()是一个生成器,因此我在此处将{__}命令放入nx.non_edges命令以实现输出。在处理大型图表时,拥有生成器非常有用。

答案 1 :(得分:2)

请注意Ezekiel Kruglick shows a better way执行此操作,现在networkx有non_edges(以及non-neighbors)功能。


您可以使用itertools.combinations迭代所有可能的边缘,并使用G.has_edge检查它是否不是G中的边缘:

import networkx as nx
import itertools as IT
G = nx.MultiGraph()
G.add_edges_from([('A', 'B'), ('B', 'C')])

missing = [pair for pair in IT.combinations(G.nodes(), 2)
           if not G.has_edge(*pair)]
print(missing)

产量

[('A', 'C')]

答案 2 :(得分:1)

@ unutbu的回答可能是最有效的方式。您还可以生成补图并发出边缘。

In [1]: import networkx as nx                                                           

In [2]: G = nx.Graph([('A', 'B'), ('B', 'C')])                                          

In [3]: print(nx.complement(G).edges()) 
[('A', 'C')]