Python NetworkX通过某些条件移除节点和边。

22
在Python库networkx中,我想删除具有某些属性的图形的节点和边缘。例如,假设我想要删除所有节点和边缘,其中节点的度数小于2。请考虑以下伪代码:
vdict = g.degree_dict()         #dictionary of nodes and their degrees
g.remove_from_nodes(v in g s.t. vdict[v] < 2)

我看到一些使用集合论符号的语法,但由于我还是 Python 新手,不知道如何使用它。我该如何将其转换为可工作的 Python 代码?

4个回答

33

Graph.remove_nodes_from() 方法需要传入节点列表。因此,您只需要创建一个满足条件的列表。您可以使用 Python 的 list comprehension 结构来紧凑地创建要删除的节点列表。

In [1]: import networkx as nx

In [2]: G = nx.Graph()

In [3]: G.add_edge(1,2)

In [4]: G.add_edge(1,3)

In [5]: G.add_edge(1,4)

In [6]: G.add_edge(2,3)

In [7]: G.add_edge(2,4)

In [8]: G.degree()
Out[8]: {1: 3, 2: 3, 3: 2, 4: 2}

In [9]: remove = [node for node,degree in dict(G.degree()).items() if degree > 2]

In [10]: remove
Out[10]: [1, 2]

In [11]: G.nodes()
Out[11]: [1, 2, 3, 4]

In [12]: G.remove_nodes_from(remove)

In [13]: G.nodes()
Out[13]: [3, 4]

请您能否在初始化“remove”时,添加一小段集合理论语言的解释呢?因为我之前没有使用过这种语言结构。 - CodeKingPlusPlus
谢谢,我需要知道正确的术语。 - CodeKingPlusPlus
您可以像使用类似的推导式一样,将第9行和第12行内联起来:G.remove_nodes_from(node for node, degree in G.degree().items() if degree > 2) - Lucretiel
但是要小心这样的内联,如果您在检查它(G.degree().items())时修改数据结构(G)。 - Aric
1
我在第9行遇到了“AttributeError: 'DegreeView' object has no attribute 'items'”错误。 - schande
显示剩余2条评论

8

如果我们有一个已初始化的图形g,下面的代码将设置fg,并满足每个顶点必须具有度数 > 0 的约束。我们可以很容易地将0泛化为一个变量:

f = nx.Graph()                                                                                                                                     
fedges = filter(lambda x: g.degree()[x[0]] > 0 and g.degree()[x[1]] > 0, g.edges())
f.add_edges_from(fedges)

4

从networkx==2.6版本起,你可以使用以下代码来操作图形G

remove = [node for node, degree in G.degree() if degree < 2]
G.remove_nodes_from(remove)

4
请注意,在Aric的networkx==2.2中,您需要将G.degree()封装在字典中,因为networkx视图对象没有items方法。该行代码应为:
[node for node,degree in dict(G.degree()).items() if degree > 2]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接