2016-12-27 14 views
1

Ich suche diese Schleife in numpy für die Beschleunigung, aber ich finde keine offensichtliche Muster, dies zu tun:beschleunigen for-Schleife in numpy

for index1 in range(1, len_route): 
     time_diff_matrix[index1, (index1+1):len_route] = \ 
      M[(index1-1):(len_route-2)] - \ 
      M[index1-1] + \ 
      N[index1-1, index1:(len_route-1)] + \ 
      N[index1, (index1+1):len_route] - \ 
      P[index1:(len_route-1)] 

Der Rest des time_diff_matrix wird mit Nullen aufgefüllt. Es war zuerst eine Doppelschleife. Ich habe eine Schleife los, aber ich weiß nicht, wie ich die andere Schleife loswerden soll. len_route ist eine große Anzahl.

Grüße.

+0

Was für den typischen Wert ist ' len_route'? Form von 'M'? – hpaulj

+0

Können Sie ein funktionierendes minimales Beispiel bereitstellen? – Moritz

+0

len_route ist zwischen 300 und 1200. – daguix

Antwort

3

Hier ist ein Ansatz mit slicing rows/columns -

n = len_route 
vals = M[:n-2] - M[:n-2,None] + N[:n-2,1:n-1] + N[1:n-1,2:n] - P[1:n-1] 
r,c = np.triu_indices(len_route-1,1) 
time_diff_matrix[r+1,c+1] = vals[r,c-1] 

Ein anderer Ansatz, anstatt mit np.triu_indices und mit np.triu zu vermeiden -

time_diff_matrix[1:n-1,2:n] = np.triu(vals) 

Ergebnisse Verify -

In [265]: # Setup inputs 
    ...: S = 10 
    ...: M = np.random.randint(11,99,(S)) 
    ...: N = np.random.randint(11,99,(S,S)) 
    ...: P = np.random.randint(11,99,(S)) 
    ...: time_diff_matrix = np.zeros((S,S), dtype=int) 
    ...: len_route = N.shape[0] 
    ...: 

In [266]: # Original approach 
    ...: for index1 in range(1, len_route): 
    ...:  time_diff_matrix[index1, (index1+1):len_route] = \ 
    ...:   M[(index1-1):(len_route-2)] - \ 
    ...:   M[index1-1] + \ 
    ...:   N[index1-1, index1:(len_route-1)] + \ 
    ...:   N[index1, (index1+1):len_route] - \ 
    ...:   P[index1:(len_route-1)] 
    ...:  

In [267]: # Proposed approach 
    ...: time_diff_matrix_out = np.zeros_like(time_diff_matrix) 
    ...: n = len_route 
    ...: vals = M[:n-2] - M[:n-2,None] + N[:n-2,1:n-1] + N[1:n-1,2:n] - P[1:n-1] 
    ...: time_diff_matrix_out[1:n-1,2:n] = np.triu(vals) 
    ...: 

In [268]: np.allclose(time_diff_matrix, time_diff_matrix_out) 
Out[268]: True 
+0

Danke, es macht eine 40% ige Geschwindigkeitsverbesserung. Es gibt zwei weitere Berechnungen, aber die numpige Optimierung überwindet dies. – daguix

+0

@daguix Betrachten Sie ['accepting'] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work) es, wenn dies Ihr Problem löste? – Divakar