我想计算标记图中具有相同标签的节点的平均最短路径。例如,红色标记为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'))
现在我只想保留标签所在的键/值对。 " A&#34 ;.所以我可以专注于具有相同标签的节点。我希望不是抽象,但你有什么想法吗?
提前致谢。
答案 0 :(得分:0)
def select_nodes_by_label(G, lab):
return [node[0] for node in G.nodes(data='label') if node[1] == lab ]
这将返回一个节点列表,我们可以使用它们来获取所有组合的最短路径。
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')
[OUT]:
1.5
这是你期望的结果吗?在更复杂的图表上测试此函数可能会很有趣。