嗨,我有一个有向图的邻接矩阵:
∞ 12 0 28 0 0 0
12 ∞ 10 43 0 0 0
0 10 ∞ 0 10 0 0
28 43 17 ∞ 0 0 0
0 31 10 0 ∞ 8 0
0 0 0 0 14 ∞ 6
0 0 0 0 0 6 ∞
这里我们有一些没有直接连接的边缘,我想用边缘之间的最小路径替换零。预期产出:
∞ 12 22 28 32 40 46
12 ∞ 10 40 20 28 34
22 10 ∞ 50 10 18 24
28 27 17 ∞ 27 35 41
32 20 10 60 ∞ 8 14
46 34 24 74 14 ∞ 6
52 40 30 80 20 6 ∞
是否有任何快速python解决方案?(请注意图表是直接的)
答案 0 :(得分:3)
首先,定义邻接矩阵。正如Kenny Ostrom所指出的那样,对角线通常为0(稍后会更多):
import numpy as np
import networkx as nx
am = np.array([[0, 12, 0, 28, 0, 0, 0],
[12, 0, 10, 43, 0, 0, 0],
[0, 10, 0, 0, 10, 0, 0],
[28, 43, 17, 0, 0, 0, 0],
[0, 31, 10, 0, 0, 8, 0],
[0, 0, 0, 0, 14, 0, 6],
[0, 0, 0, 0, 0, 6, 0]])
现在找到最短的距离:
dists = nx.floyd_warshall_numpy(nx.from_numpy_matrix(am, create_using=nx.DiGraph()))
(非常感谢@curious_cat指出需要create_using=nx.DiGraph()
,BTW。)
最后,您可以按找到的距离替换0条目:
>>> np.where(am, am, dists)
array([[ 0., 12., 22., 28., 32., 40., 46.],
[ 12., 0., 10., 43., 20., 28., 34.],
[ 22., 10., 0., 50., 10., 18., 24.],
[ 28., 43., 17., 0., 27., 35., 41.],
[ 32., 31., 10., 60., 0., 8., 14.],
[ 46., 34., 24., 74., 14., 0., 6.],
[ 52., 40., 30., 80., 20., 6., 0.]])
如果你想让对角线成为别的东西(这对我来说不那么有意义,我必须说),你可以使用np.fill_diagonal
。