Jak wektoryzować ten kod Pythona?

Próbuję używać operacji NumPy i wektoryzacji, aby sekcja kodu działała szybciej. Wydaje mi się jednak, że nie rozumiem, jak wektoryzować ten kod (prawdopodobnie z powodu niepełnego zrozumienia wektoryzacji).

Oto działający kod z pętlami (A i B to tablice 2D o ustalonym rozmiarze, już zainicjowane):

for k in range(num_v):
    B[:] = A[:]
    for i in range(num_v):
        for j in range(num_v):
            A[i][j] = min(B[i][j], B[i][k] + B[k][j])
return A

Oto moja próba wektoryzacji powyższego kodu:

for k in range(num_v):
    B = numpy.copy(A)
    A = numpy.minimum(B, B[:,k] + B[k,:])
return A

Do ich testowania użyłem poniższego, z powyższym kodem zawiniętym w funkcję zwaną „algorytmem”:

def setup_array(edges, num_v):
    r = range(1, num_v + 1)
    A = [[None for x in r] for y in r]  # or (numpy.ones((num_v, num_v)) * 1e10) for numpy
    for i in r:
        for j in r:
            val = 1e10
            if i == j:
                val = 0 
            elif (i,j) in edges:
                val = edges[(i,j)]
            A[i-1][j-1] = val 
    return A

A = setup_array({(1, 2): 2, (6, 4): 1, (3, 2): -3, (1, 3): 5, (3, 6): 5, (4, 5): 2, (3, 1): 4, (4, 3): 8, (3, 4): 6, (2, 4): -4, (6, 5): -5}, 6) 
B = []
algorithm(A, B, 6)

Oczekiwany wynik, a to, co otrzymam z pierwszym kodem to:

[[0, 2, 5, -2, 0, 10] 
 [8, 0, 4, -4, -2, 9]
 [4, -3, 0, -7, -5, 5]
 [12, 5, 8, 0, 2, 13]
 [10000000000.0, 9999999997.0, 10000000000.0, 9999999993.0, 0, 10000000000.0]
 [13, 6, 9, 1, -5, 0]]

Druga funkcja (wektoryzowana) zwraca natomiast:

[[ 0. -4.  0.  0.  0.  0.]
 [ 0. -4.  0. -4.  0.  0.]
 [ 0. -4.  0.  0.  0.  0.]
 [ 0. -4.  0.  0.  0.  0.]
 [ 0. -4.  0.  0.  0.  0.]
 [ 0. -4.  0.  0. -5.  0.]]

czego mi brakuje?

questionAnswers(2)

yourAnswerToTheQuestion