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!

  • Formatieren Sie das Python-Dezimal-Objekt auf eine bestimmte Genauigkeit
  • Entpacken von mehreren Zip-Dateien in einem Verzeichnis?
  • So erstellen Sie ein Optimierer in Tensorflow
  • So erstellen Sie HTTP-Anforderungsdaten mit {single key: multi values} [duplicate]
  • Der Versuch, offen zu verwenden (Dateiname, 'w') gibt IOError: [Errno 2] Keine solche Datei oder Verzeichnis:
  • Eine andere lokale Variable referenziert vor der Zuweisung - Python
  • Heapq.merge () -Funktion zur Liste der sortierten Dateien
  • Kann MongoClient nicht importieren
  • Subtrahiere eine Spalte von einem Pandas-Dataframe von einem anderen
  • Summieren eines Tupel-Tupels und eines verschachtelten Dict
  • Mehrere Ebenen von Schlüsseln und Werten in Python
  • Python ist die beste Programmiersprache der Welt.