2017-04-24 8 views
0

相互排他的なエッジを持つグラフから別のグラフを作成しようとしています。リスト内の検索用ではないPythonが機能していない

元のグラフからノードをランダムに描画し、元のグラフに既に存在するかどうかを確認しています。 not inコマンドが正常に動作しません。

私のコードは以下の通りです。

import networkx as nx 
import numpy as np 
import random 
G=nx.karate_club_graph() 
K=nx.Graph() 
sample_len=len(G.edges()) 
while(len(K.edges())<sample_len): 
    n1=random.choice(G.nodes()) 
    n2=random.choice(G.nodes()) 
    e=(n1,n2) 
    if(e not in G.edges()): 
     K.add_edge(*e) 
i=0 
for x in G.edges(): 
    if(x in K.edges()): 
     i+=1 
print i 

このコードを実行するたびに、iの値は5〜10の間にあります。

+0

結果として期待しているものはありますか? –

+0

私は2つのグラフ間の共通のエッジをチェックしています。答えはゼロでなければなりません。 –

+0

もしあなたがG = nx.karate_club_graph()の例を私に送ったら K = nx.Graph()私はあなたのためにそれを得ようとしますが、それは難しいとは思わないが、 numpyライブラリを使用して、ちょうど私が申し訳ありませんができないコードを読んで! –

答えて

1

使用Graph.has_edge()

import networkx as nx 
import numpy as np 
import random 
G=nx.karate_club_graph() 
K=nx.Graph() 
sample_len=len(G.edges()) 
while(len(K.edges())<sample_len): 
    n1=random.choice(G.nodes()) 
    n2=random.choice(G.nodes()) 
    e=(n1,n2) 
    if(not G.has_edge(*e)): 
     K.add_edge(*e) 
i=0 
for x in G.edges(): 
    if(K.has_edge(*x)): 
     i+=1 
print(i) 

問題はおそらくnetworkxが期待どおりにエッジを保存しているためです。無向グラフの場合は、(n1, n2)または(n2, n1)が有効です。したがって、以下のチェックでも問題は解決しますが、明らかに、has_edge()を使用するよりも冗長です。

if((n1, n2) not in G.edges() and (n2, n1) not in G.edges()): 
    K.add_edge(n1, n2) 
+0

G.has_edge()が機能しています。ありがとう。それでも、「ではない」と間違っていることを理解できませんでした。 –

+0

上記の説明を参照してください。私は、networkxがエッジを別々に保存する可能性があると信じています。例えば。 'G'は、エッジ'(1,2) 'を含んでいます。次に、エッジ '(2,1)'が存在するかどうかをチェックします。それは 'K'に追加しません。後で、グラフ 'K'でエッジ'(1,2) 'を検索します。 'K'は'(2,1) 'を'(1,2) 'として保存する可能性があるので、それが見つかるはずです。これはすべて、グラフが無向であることを前提としています。 – Flurin

0

あなたはこのような方法で行うことができます差をつけたい場合:

print (list(set(G.edges()) - set(K.edges()))) 

あなただけの数がlen

print (len(list(set(G.edges()) - set(K.edges())))) 

を追加したい場合は、それはあなたがしようとしている何本だ場合は私に知らせてくださいアーカイブ;)

関連する問題