Gibt es einen schnelleren Weg, um zwei 2-d numpy Array hinzuzufügen

Lassen Sie sagen, ich habe zwei große 2-d numpy Array von gleichen Dimensionen (sagen 2000×2000). Ich möchte sie elementweise summieren. Ich frage mich, ob es einen schnelleren Weg als np.add ()

Bearbeiten: Ich füge ein ähnliches Beispiel von dem hinzu, was ich jetzt benutze. Gibt es eine Möglichkeit, dies zu beschleunigen?

#a and b are the two matrices I already have.Dimension is 2000x2000 #shift is also a list that is previously known for j in range(100000): b=np.roll(b, shift[j] , axis=0) a=np.add(a,b) 

One Solution collect form web for “Gibt es einen schnelleren Weg, um zwei 2-d numpy Array hinzuzufügen”

Ansatz # 1 (Vektorisiert)

Wir können das modulus , um das zirkulierende Verhalten von roll/circshift und mit ausgestrahlten Indizes zu simulieren, um alle Zeilen zu decken, wir hätten einen völlig vektorisierten Ansatz,

 n = b.shape[0] idx = n-1 - np.mod(shift.cumsum()[:,None]-1 - np.arange(n), n) a += b[idx].sum(0) 

Ansatz # 2 (Loopy)

 b_ext = np.row_stack((b, b[:-1] )) start_idx = n-1 - np.mod(shift.cumsum()-1,n) for j in range(start_idx.size): a += b_ext[start_idx[j]:start_idx[j]+n] 

Colon Notation vs mit Indizes für das Slicing

Die Idee hier, um minimal zu arbeiten, sobald wir in der Schleife sind. Wir rechnen den Startreihenindex jeder Iteration vor dem Gehen in die Schleife vor. Also, alles was wir brauchen, um einmal in der Schleife zu tun, schneidet man mit einer Dickdarm-Notation, was eine Ansicht in das Array ist und sich addiert. Das sollte viel besser sein als das rolling , das alle diese Zeilenindizes berechnen muss, die zu einer Kopie führen, die teuer ist.

Hier ist ein bisschen mehr in die Ansicht und kopieren Sie Konzepte beim Schneiden mit Dickdarm und Indizes –

 In [11]: a = np.random.randint(0,9,(10)) In [12]: a Out[12]: array([8, 0, 1, 7, 5, 0, 6, 1, 7, 0]) In [13]: a[3:8] Out[13]: array([7, 5, 0, 6, 1]) In [14]: a[[3,4,5,6,7]] Out[14]: array([7, 5, 0, 6, 1]) In [15]: np.may_share_memory(a, a[3:8]) Out[15]: True In [16]: np.may_share_memory(a, a[[3,4,5,6,7]]) Out[16]: False 

Runtime-Test

Funktionsdefinitionen –

 def original_loopy_app(a,b): for j in range(shift.size): b=np.roll(b, shift[j] , axis=0) a += b def vectorized_app(a,b): n = b.shape[0] idx = n-1 - np.mod(shift.cumsum()[:,None]-1 - np.arange(n), n) a += b[idx].sum(0) def modified_loopy_app(a,b): n = b.shape[0] b_ext = np.row_stack((b, b[:-1] )) start_idx = n-1 - np.mod(shift.cumsum()-1,n) for j in range(start_idx.size): a += b_ext[start_idx[j]:start_idx[j]+n] 

Fall 1:

 In [5]: # Setup input arrays ...: N = 200 ...: M = 1000 ...: a = np.random.randint(11,99,(N,N)) ...: b = np.random.randint(11,99,(N,N)) ...: shift = np.random.randint(0,N,M) ...: In [6]: original_loopy_app(a1,b1) ...: vectorized_app(a2,b2) ...: modified_loopy_app(a3,b3) ...: In [7]: np.allclose(a1, a2) # Verify results Out[7]: True In [8]: np.allclose(a1, a3) # Verify results Out[8]: True In [9]: %timeit original_loopy_app(a1,b1) ...: %timeit vectorized_app(a2,b2) ...: %timeit modified_loopy_app(a3,b3) ...: 10 loops, best of 3: 107 ms per loop 10 loops, best of 3: 137 ms per loop 10 loops, best of 3: 48.2 ms per loop 

Fall Nr. 2:

 In [13]: # Setup input arrays (datasets are exactly 1/10th of original sizes) ...: N = 200 ...: M = 10000 ...: a = np.random.randint(11,99,(N,N)) ...: b = np.random.randint(11,99,(N,N)) ...: shift = np.random.randint(0,N,M) ...: In [14]: %timeit original_loopy_app(a1,b1) ...: %timeit modified_loopy_app(a3,b3) ...: 1 loops, best of 3: 1.11 s per loop 1 loops, best of 3: 481 ms per loop 

Also, wir schauen 2x+ beschleunigen dort mit dem modifizierten loopy Ansatz!

  • Python-Daten kratzen mit Scrapy
  • Warum dict (k = 4, z = 2) .update (dict (l = 1)) return keine in Python?
  • Führen Sie 'query session' aus python
  • Wie verwende ich Python, um Registry-Werte abzurufen?
  • Scrapy python Anfrage ist nicht definiert
  • Parallele Berechnungsaufgabe zu Brute-Force in Python
  • Wie kann man Pandas DataFrame von floats mit einem Formatstring für Spalten anzeigen?
  • Prozess-Socket-Daten, die mit einem Zeilenumbruch enden
  • IPython Notebook Gebietsschema Fehler [Duplikat]
  • Python Desktop Application Database
  • PyQt4 Namen, die als undefined in Eclipse, aber es läuft gut
  • Python ist die beste Programmiersprache der Welt.