Networkx 带标签的平均最短路径
Networkx Average shortest path with labels
我想计算标记图中具有相同标记的节点的平均最短路径。例如,红色标记为 A,黑色标记为 B。
G = nx.DiGraph()
G.add_node('A', label = 'A')
G.add_node('B', label = 'B')
G.add_node('C', label = 'A')
G.add_node('D', label = 'B')
G.add_edges_from([('A', 'B'), ('B', 'C'), ('C', 'D'), ('D', 'A')])
H = G.to_undirected()
现在我只想计算 A 的平均最短路径,基于此
V_m 是具有相同标签的顶点。 n_{i,j} 是最短路径的数量,
d_{i,j} 是测地距离。
我想使用 Networkx 来实现它。开始使用节点属性进行标记。
我可以用
读出带有标签的节点
graph_labels = (nx.get_node_attributes(G, 'label'))
现在我只想将 key/value 对保留在标签所在的位置,例如"A"。所以我可以专注于具有相同标签的节点。我希望它不是抽象的,但你有什么想法吗?
提前致谢。
Select 个标签节点
def select_nodes_by_label(G, lab):
return [node[0] for node in G.nodes(data='label') if node[1] == lab ]
这个returns我们可以用来获取所有组合的最短路径的节点列表。
from itertools import combinations
def avg_shortest_path_labeled_node(G, lab):
sel_nodes = select_nodes_by_label(G,lab)
V_m = len(sel_nodes)
# collect all lengths of shortest paths from combinations of labeled nodes
sp_len = [len(nx.shortest_path(G,c[0], c[1])) for c in combinations(sel_nodes,2)]
n = len(sp_len)
return sum(sp_len)/(n) * 1/(V_m * (V_m - 1))
测试
avg_shortest_path_labeled_node(G,'A')
[输出]:
1.5
这是你期待的结果吗?在更复杂的图形上测试此函数可能会很有趣。
我想计算标记图中具有相同标记的节点的平均最短路径。例如,红色标记为 A,黑色标记为 B。
G = nx.DiGraph()
G.add_node('A', label = 'A')
G.add_node('B', label = 'B')
G.add_node('C', label = 'A')
G.add_node('D', label = 'B')
G.add_edges_from([('A', 'B'), ('B', 'C'), ('C', 'D'), ('D', 'A')])
H = G.to_undirected()
现在我只想计算 A 的平均最短路径,基于此
V_m 是具有相同标签的顶点。 n_{i,j} 是最短路径的数量, d_{i,j} 是测地距离。
我想使用 Networkx 来实现它。开始使用节点属性进行标记。
我可以用
读出带有标签的节点graph_labels = (nx.get_node_attributes(G, 'label'))
现在我只想将 key/value 对保留在标签所在的位置,例如"A"。所以我可以专注于具有相同标签的节点。我希望它不是抽象的,但你有什么想法吗?
提前致谢。
Select 个标签节点
def select_nodes_by_label(G, lab):
return [node[0] for node in G.nodes(data='label') if node[1] == lab ]
这个returns我们可以用来获取所有组合的最短路径的节点列表。
from itertools import combinations
def avg_shortest_path_labeled_node(G, lab):
sel_nodes = select_nodes_by_label(G,lab)
V_m = len(sel_nodes)
# collect all lengths of shortest paths from combinations of labeled nodes
sp_len = [len(nx.shortest_path(G,c[0], c[1])) for c in combinations(sel_nodes,2)]
n = len(sp_len)
return sum(sp_len)/(n) * 1/(V_m * (V_m - 1))
测试
avg_shortest_path_labeled_node(G,'A')
[输出]:
1.5
这是你期待的结果吗?在更复杂的图形上测试此函数可能会很有趣。