我正在尝试从给定的图形创建另一个具有互斥边缘的图形。
我从原始图形中随机绘制节点并检查它是否已存在于原始图形中。 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 :(得分: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)
答案 1 :(得分:0)
如果您想要通过这种方式实现差异:
print (list(set(G.edges()) - set(K.edges())))
如果您只想要一个数字,请添加len
print (len(list(set(G.edges()) - set(K.edges()))))
请告诉我这是否是您要存档的内容;)