15

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

4 に答える 4

25

Graph.remove_nodes_from() メソッドは、ノードのリスト (実際にはコンテナー) を取ります。したがって、条件を満たすリストを作成するだけです。Python のリスト内包表記構造を使用して、削除するノードのリストをコンパクトに作成できます。

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]
于 2013-08-16T13:16:53.060 に答える
7

初期化されたグラフがある場合、以下は、各頂点の次数が 0より大きくなければならないという制約に従うgように設定されます。変数を使用して 0 を簡単に一般化できます。fg

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)
于 2013-08-17T17:10:56.873 に答える