如何在 networkx 中用 python 随机排列图的节点?
How can I randomly permute the nodes of a graph with python in networkx?
我认为这可以用 relabel_nodes 来完成,但我如何创建一个排列节点的映射?我想在保持网络结构不变的同时置换图形的节点。目前我正在用一组打乱的节点重建图表,这似乎不是最有效的处理方式:
import networkx as nx
import random
n=10
nodes=[]
for i in range(0,n):
nodes.append(i)
G=nx.gnp_random_graph(n,.5)
newG=nx.empty_graph(n)
shufflenodes=nodes
random.shuffle(shufflenodes)
for i in range(0,n-1):
for j in range(i+1,n):
if(G.has_edge(i,j)):
newG.add_edge(shufflenodes[i],shufflenodes[j])
有人知道如何加快速度吗?
你可以做的是建立一个随机映射并使用relabel_nodes。
代码:
# create a random mapping old label -> new label
node_mapping = dict(zip(G.nodes(), sorted(G.nodes(), key=lambda k: random.random())))
# build a new graph
G_new = nx.relabel_nodes(G, node_mapping)
示例:
>>> G.nodes()
NodeView((0, 1, 2, 3, 4))
>>> G.edges()
EdgeView([(0, 1), (0, 2), (0, 3), (1, 2), (3, 4)])
>>> node_mapping
{0: 2, 1: 0, 2: 3, 3: 4, 4: 1}
>>> G_new.nodes()
NodeView((2, 0, 3, 4, 1))
>>> G_new.edges()
EdgeView([(2, 0), (2, 3), (2, 4), (0, 3), (4, 1)])
我认为这可以用 relabel_nodes 来完成,但我如何创建一个排列节点的映射?我想在保持网络结构不变的同时置换图形的节点。目前我正在用一组打乱的节点重建图表,这似乎不是最有效的处理方式:
import networkx as nx
import random
n=10
nodes=[]
for i in range(0,n):
nodes.append(i)
G=nx.gnp_random_graph(n,.5)
newG=nx.empty_graph(n)
shufflenodes=nodes
random.shuffle(shufflenodes)
for i in range(0,n-1):
for j in range(i+1,n):
if(G.has_edge(i,j)):
newG.add_edge(shufflenodes[i],shufflenodes[j])
有人知道如何加快速度吗?
你可以做的是建立一个随机映射并使用relabel_nodes。
代码:
# create a random mapping old label -> new label
node_mapping = dict(zip(G.nodes(), sorted(G.nodes(), key=lambda k: random.random())))
# build a new graph
G_new = nx.relabel_nodes(G, node_mapping)
示例:
>>> G.nodes()
NodeView((0, 1, 2, 3, 4))
>>> G.edges()
EdgeView([(0, 1), (0, 2), (0, 3), (1, 2), (3, 4)])
>>> node_mapping
{0: 2, 1: 0, 2: 3, 3: 4, 4: 1}
>>> G_new.nodes()
NodeView((2, 0, 3, 4, 1))
>>> G_new.edges()
EdgeView([(2, 0), (2, 3), (2, 4), (0, 3), (4, 1)])