Exercise 2.105#
import numpy as np
inf = float("inf")
M1 = np.array([[0, inf, 3, inf], [2, 0 , inf, 5], [inf, 3, 0 , inf], [inf, inf, 6, 0]])
# See https://stackoverflow.com/a/55986817/622049
M2 = np.min(M1[:,:,None] + M1[None,:,:], axis=1)
M3 = np.min(M2[:,:,None] + M1[None,:,:], axis=1)
M4 = np.min(M2[:,:,None] + M2[None,:,:], axis=1)
M1, M2, M3, M4
(array([[ 0., inf, 3., inf],
[ 2., 0., inf, 5.],
[inf, 3., 0., inf],
[inf, inf, 6., 0.]]),
array([[ 0., 6., 3., inf],
[ 2., 0., 5., 5.],
[ 5., 3., 0., 8.],
[inf, 9., 6., 0.]]),
array([[ 0., 6., 3., 11.],
[ 2., 0., 5., 5.],
[ 5., 3., 0., 8.],
[11., 9., 6., 0.]]),
array([[ 0., 6., 3., 11.],
[ 2., 0., 5., 5.],
[ 5., 3., 0., 8.],
[11., 9., 6., 0.]]))