我想从图中随机提取设定边。我可以这样做:
import networkx as nx
from random import sample
g = nx.karate_club_graph()
k=5
print sample(g.edges(), k)
输出
# [(0, 31), (15, 32), (31, 33), (8, 32), (4, 10)]
但是,我希望每个顶点出现一次
例如:
(0, 31) and (31, 33) # --> incorrect
我试过了:
result = []
while len(g.edges()):
edges = g.edges()
shuffle(edges)
result.append(edges[0])
g.remove_nodes_from([edges[0][0],edges[0][1]])
但是,效果不佳。删除图形的顶点是一项繁重的操作。
任何人都知道一种有效的方法而不删除图的顶点?
答案 0 :(得分:3)
这应该有效,但可能会返回少于n
边:
def get_rand_edges(g, n):
visited = set()
results = []
edges = random.sample(g.edges(), n)
for edge in edges:
if edge[0] in visited or edge[1] in visited:
continue
results.append(edge)
if len(results) == n:
break
visited.update(edge)
return results
答案 1 :(得分:1)
迭代遍历边缘可能很昂贵,因为边缘可能比顶点多得多(| V | *(| V | -1)/ 2)。
这个问题相当于选择成对连接的2n个随机顶点。它可以通过存储已经选择的顶点集并随机选择下一个顶点并且它们是尚未选择的邻居来实现。
描述的算法很贪婪。 n的上限由maximum matching给出。在n接近最大匹配基数的情况下,上层算法可能失败。在这种情况下,必须使用标准匹配算法。