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]
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.