2016-07-11 4 views
2

私はnetworkxを使い始めました。何か助けてください。グラフから小さな成分を取り除く方法

ノードとエッジを生成するために処理したデータセットがあります。それらの中に2つ以上のリンクを持つ約5000のノードグループがあります(合計でグループ内に最大10ノード)。しかし問題は、それらの間に1つのエッジしか持たない数千対のノードが存在することである。すなわち、ノードaはノードbにリンクされているが、いずれも他のノードにはリンクされていない。

これらのペアのノードをグラフから削除したいと考えています。

これをフィルタリングする方法はありますか?

+0

私が理解しているかどうかを見てみましょう:グラフ「G」があり、3つ以上のノードの構成要素ではないすべてのノードを「G」から削除したいですか? – Joel

+0

Joel - それは問題を説明するはるかにエレガントな方法です。 –

+0

私はタイトルを編集して、これを検索エンジンで見つける可能性のある他の人にもっと便利にしました。私がそれを適切に変更したと思わないならば、自由に変更してください。 – Joel

答えて

2

私たちの目標は、ノードが3つ未満のコンポーネントからすべてのノードを削除することです(これには、存在する場合は独立したノードが含まれます)。 nx.connected_componentsを使用する場合

for component in list(nx.connected_components(G)): 
    if len(component)<3: 
     for node in component: 
      G.remove_node(node) 

小さな警告がオーダーです。コンポーネントのgeneratorを返します。 listを置かないと、一度に1つずつ生成され、指定されたコンポーネントの手順が実行されます。すべての作業が完了すると、次のコンポーネントが生成されます。しかし、Gが変更されているため、pythonはこれがうまく動作することを確信できません。だから、それは死んでしまう(辞書がサイズが変わったという不満--- Gのノードの数が変わった)。これをリストにすると、ループを開始する前にコンポーネントがすべて検出されます。したがって、コンポーネントが見つかっている間、グラフは変化しません。

+0

それは素晴らしいです - とても多くのありがとうございます。私ができるならば投票するだろう。 –

関連する問題