[PYTHON] Ich habe die Verarbeitungsgeschwindigkeit der numpy eindimensionalisierung überprüft

Motivation zum Bloggen

Abflachen des Numpy-Arrays. Ich habe versucht herauszufinden, wie stark der Geschwindigkeitsunterschied je nach Verarbeitungsmethode auftreten würde. Der Code läuft auf Jupyter.

reshape Erstens ist die grundlegende "Umformung". Schauen wir uns die Verarbeitungsgeschwindigkeit an, wenn Sie ein 10000 x 10000-Array erstellen und es reduzieren.

import numpy as np

np.random.seed(0)
a = np.random.randn(10**4, 10**4)
print(a)

Ausgabe

[[ 1.76405235e+00  4.00157208e-01  9.78737984e-01 ...  5.16872179e-01
  -3.29206931e-02  1.29811143e+00]
 [-2.02117027e-01 -8.33231001e-01  1.73360025e+00 ... -5.72592527e-02
  -1.05893126e+00 -3.26528442e-01]
 [ 3.30045889e-01 -4.79979434e-04  8.18115898e-01 ... -1.51127631e+00
   9.76843833e-01  1.25550065e+00]
 ...

Führen Sie "Umformen" aus

%%time

b = a.reshape(-1)
b[0] = 100.
print(b[:5], '\n')
print(a[0, :5], '\n')

Ausgabe

[100.           0.40015721   0.97873798   2.2408932    1.86755799] 

[100.           0.40015721   0.97873798   2.2408932    1.86755799] 

CPU times: user 2 ms, sys: 0 ns, total: 2 ms
Wall time: 2.15 ms

Wenn Sie die "Umform" -Methode so wie sie ist verwenden, wird sie wie oben gezeigt unter Bezugnahme auf das ursprüngliche Array "a" übergeben. Es ist schnell, ohne dass ein neuer Speicherbereich gesichert werden muss. Beachten Sie jedoch, dass sich auch der Wert von "a" ändert.

flatten

%%time

b = a.flatten()
b[0] = 100.
print(b[:5], '\n')
print(a[0, :5], '\n')

Ausgabe

[100.           0.40015721   0.97873798   2.2408932    1.86755799] 

[1.76405235 0.40015721 0.97873798 2.2408932  1.86755799] 

CPU times: user 152 ms, sys: 378 ms, total: 530 ms
Wall time: 532 ms

flatten übergibt eine Kopie des ursprünglichen Arrays wie oben. Das Ändern des Werts von "b" ändert also nicht den ursprünglichen Wert von "a". Die Verarbeitungsgeschwindigkeit ist jedoch aufgrund der Zuweisung eines neuen Speicherbereichs sehr unterschiedlich. Es kann nicht unbedingt gesagt werden, aber wenn man nur die obigen Ergebnisse betrachtet, ist die Verarbeitungsgeschwindigkeit fast 250-mal schneller als "Umformen".

ravel

%%time

b = a.ravel()
b[0] = 100.
print(b[:5], '\n')
print(a[0, :5], '\n')

Ausgabe

[100.           0.40015721   0.97873798   2.2408932    1.86755799] 

[100.           0.40015721   0.97873798   2.2408932    1.86755799] 

CPU times: user 2.75 ms, sys: 0 ns, total: 2.75 ms
Wall time: 3.36 ms

Wie "Umformen" wird "Ravel" als Referenz übergeben und die Verarbeitungsgeschwindigkeit ist hoch.

resize

Die "Größenänderung" ist destruktiv. Also ändert es das Objekt selbst, das "a" genannt wird. Im Gegensatz zur "Umform" -Methode ändert sich die Form und die Anzahl der Werte, selbst wenn sie nicht übereinstimmen, ohne Fehler zu einer guten. Im folgenden Beispiel sehen Sie, dass der Wert von "a" ständig aktualisiert wird.

a.resize(1, 10000*10000)
print(a[:5], '\n')
a.resize(2, 2)
print(a, '\n')
a.resize(3, 3)
print(a, '\n')
a.resize(1)
print(a)

Ausgabe

[[ 1.76405235  0.40015721  0.97873798 ...  0.32191089  0.25199669
  -1.22612391]] 

[[1.76405235 0.40015721]
 [0.97873798 2.2408932 ]] 

[[1.76405235 0.40015721 0.97873798]
 [2.2408932  0.         0.        ]
 [0.         0.         0.        ]] 

[1.76405235]

Wenn Sie den Wert vor der Konvertierung nicht ändern möchten, schreiben Sie wie folgt.

%%time

b = np.resize(a, (-1, ))
b[0] = 100.
print(b[:5], '\n')
print(a[0, :5], '\n')
print(a.shape, '\n')
print(b.shape,  '\n')

Ausgabe

[100.           0.40015721   0.97873798   2.2408932    1.86755799] 

[1.76405235 0.40015721 0.97873798 2.2408932  1.86755799] 

(10000, 10000) 

(99999999,) 

CPU times: user 235 ms, sys: 1.95 ms, total: 237 ms
Wall time: 239 ms

!?

Das "a" hat sich nicht geändert, aber wenn Sie genau hinschauen, ist der wesentliche "b" -Wert eins weniger. Wenn Sie wie oben "(-1,)" angeben, wird die Anzahl der Größenänderungen anscheinend um eins reduziert. Es ist wie. Wenn Sie also die Größe ändern möchten, müssen Sie die Größe wie "a.resize (1, 10000 * 10000)" in der obigen Zelle 4 explizit angeben.

(Zusatz) ** resize (-1) scheint eine Spezifikation zu sein, mit Ausnahme des letzten Wertes, der wie in den Kommentaren in diesem Blog angegeben wurde.

c = np.arange(6).reshape(2, 3)
d = np.resize(c, (-1,))
print(c, '\n')
print(d)

Ausgabe

[[0 1 2]
 [3 4 5]] 

[0 1 2 3 4]

Nachwort

Wenn Sie Geschwindigkeit wollen, "umformen". Wenn Sie eine Kopie geben möchten, denke ich persönlich, dass "Abflachen" vorerst nicht unpraktisch sein wird, aber ich wäre dankbar, wenn jemand, der mit diesem Bereich vertraut ist, einen Kommentar abgeben könnte.

Recommended Posts

Ich habe die Verarbeitungsgeschwindigkeit der numpy eindimensionalisierung überprüft
Ich habe den Inhalt des Docker-Volumes überprüft
Ich habe die Optionen von copyMakeBorder von OpenCV überprüft
Über die Verarbeitungsgeschwindigkeit von SVM (SVC) von Scikit-Learn
Ich habe die Liste der Tastenkombinationen von Jupyter überprüft
Ich habe die Sitzungsaufbewahrungsdauer von Django überprüft
Ich habe die Ausgabespezifikationen von Bidirectional LSTM von PyTorch überprüft
Ich habe mir die Versionen von Blender und Python angesehen
Ich habe das Standardbetriebssystem und die Shell der Docker-Maschine überprüft
python3 Messen Sie die Verarbeitungsgeschwindigkeit.
Ich habe versucht, die Verarbeitungsgeschwindigkeit mit dplyr von R und pandas von Python zu vergleichen
So erhöhen Sie die Verarbeitungsgeschwindigkeit der Erfassung der Scheitelpunktposition
Ich möchte die Authentizität eines Elements eines numpy-Arrays bestimmen
Ich habe die Grundoperation von Numpy im Jupyter Lab geschrieben.
Ich habe den Mechanismus der Flaschenanmeldung untersucht!
Ich habe den Betrag der Schenkungssteuer überprüft
Ich habe die Geschwindigkeit von Hash mit Topaz, Ruby und Python verglichen
Ich habe den Nutzungsstatus des Parkplatzes anhand von Satellitenbildern überprüft.
Ich habe das Bild der Science University auf Twitter mit Word2Vec überprüft.
Ich habe den asynchronen Server von Django 3.0 ausprobiert
Ich habe versucht, die Trefferergebnisse von Hachinai mithilfe der Bildverarbeitung zu erhalten
Die Ordnerstruktur von Flask ist zusammengefasst
Ich habe versucht, die Version 2020 mit 100 Sprachverarbeitung zu lösen [Kapitel 3: Reguläre Ausdrücke 25-29]
Zusammenfassung der Numpy-Funktionen, die ich nicht kannte
Die Python-Projektvorlage, an die ich denke.
Ich habe die Anzahl der bundesweit geschlossenen und eröffneten Geschäfte von Corona überprüft
Die Geschichte der Verarbeitung A von Blackjack (Python)
Ich habe die Geschwindigkeit der Listeneinschlussnotation für und während mit Python2.7 gemessen.
Python: Ich möchte die Verarbeitungszeit einer Funktion genau messen
Ich verglich die Geschwindigkeit von Go Language Web Framework Echo und Python Web Framework Flask
Ich habe die Geschwindigkeit regulärer Ausdrücke in Ruby, Python und Perl (Version 2013) verglichen.
Ich habe versucht, die 2020-Version von 100 Sprachverarbeitungsproblemen zu lösen [Kapitel 1: Vorbereitungsbewegung 00-04]
Ich habe versucht, die 2020-Version von 100 Sprachverarbeitungsproblemen zu lösen [Kapitel 1: Vorbereitungsbewegung 05-09]
Ich habe die Pivot-Table-Funktion von Pandas ausprobiert
Ich habe in der Bibliothek nach der Verwendung der Gracenote-API gesucht
Ich habe versucht, die Wetterkarte einer Clusteranalyse zu unterziehen
Ich habe die Implementierung von range gelesen (Objects / rangeobject.c)
Ich habe das tiefste Problem von Hiroshi Yuki gelöst.
Zeigen Sie das Ergebnis der Geometrieverarbeitung in Python an
Ich habe versucht, die Trapezform des Bildes zu korrigieren
Vergleichen Sie die Geschwindigkeit von Python Append und Map
Bildverarbeitung? Die Geschichte, Python für zu starten
Die Form der eindimensionalen Anordnung von Numpy war kompliziert
Ich habe einige der neuen Funktionen von Python 3.8 touched angesprochen
[Python numpy] Geben Sie den Index des Arrays dynamisch an
Berechnungsgeschwindigkeit der Indizierung für ein numpy quadratisches Array
Ich habe die Varianten von UKR gelesen und implementiert
Informationen zum Verhalten der Warteschlange während der Parallelverarbeitung
Ich möchte das Erscheinungsbild von zabbix anpassen
Ich habe den im Qiita Adventskalender 2016 gelöschten Kalender überprüft
Ich habe versucht, den Bildfilter von OpenCV zu verwenden
Ich habe versucht, die Texte von Hinatazaka 46 zu vektorisieren!
Ich habe die Referenzgeschwindigkeit überprüft, wenn ich Python-Liste, Wörterbuch und Set-Typ verwendet habe.
Ich habe die Geschwindigkeit der Referenz des Pythons in der Liste und die Referenz der Wörterbucheinbeziehung aus der In-Liste verglichen.
[Rezept des Trainers] Ich habe die Flasche des Python-Frameworks berührt.
Ich möchte das Ausführungsergebnis von strace erfassen
Ich habe versucht, die Grundform von GPLVM zusammenzufassen