Was ist der schnellste Weg, um Daten von Array b nach Array a zu kopieren, ohne die Adresse von Array a zu ändern. Ich brauche dies, weil eine externe Bibliothek (PyFFTW) einen Zeiger auf mein Array verwendet, der sich nicht ändern kann.
Beispielsweise:
a = numpy.empty(n, dtype=complex)
for i in xrange(a.size):
a[i] = b[i]
Ist es möglich, es ohne Schleife zu tun?
a = b
erstellt lediglich einen neuen Verweis aufb
.a[:] = b
bedeutet "setze alle Elementea
gleich denen vonb
". Der Unterschied ist wichtig, da Numpy-Arrays veränderbare Typen sind.empty()
etwa 10% schneller sind alszeros()
. Überraschenderweiseempty_like()
ist noch schneller.copyto(a,b)
ist schneller als die Array-Syntaxa[:] = b
. Siehe gist.github.com/bhawkins/5095558np.copyto(a, b)
und wanna = b.astype(b.dtype)
eine Geschwindigkeitsverbesserung erforderlich istempty_like
es so viel schneller ist alsempty
, zumalzeros_like
es langsamer ist alszeros
. Übrigens habe ich gerade meinen Benchmark (jetzt aktualisiert) erneut ausgeführt, und der Unterschied zwischencopyto(a,b)
unda[:] = b
scheint sich verflüchtigt zu haben. gist.github.com/bhawkins/5095558NumPy Version 1.7 hat die
numpy.copyto
Funktion, die genau das tut, wonach Sie suchen:Siehe: https://docs.scipy.org/doc/numpy/reference/generated/numpy.copyto.html
quelle
AttributeError: 'module' object has no attribute 'copyto'
ist sogar noch schneller als die vorgeschlagenen Lösungen bis numpy v1.6 und erstellt auch eine Kopie des Arrays. Ich konnte es jedoch nicht gegen copyto (a, b) testen, da ich nicht die neueste Version von numpy habe.
quelle
Um Ihre Frage zu beantworten, habe ich mit einigen Varianten gespielt und sie profiliert.
Fazit: Um Daten von einem Numpy-Array in ein anderes zu kopieren, verwenden Sie eine der integrierten Numpy-Funktionen
numpy.array(src)
odernumpy.copyto(dst, src)
wo immer möglich.(Wählen Sie jedoch immer die spätere Option
dst
, wenn der Speicher bereits zugewiesen ist, um den Speicher wiederzuverwenden. Siehe Profilerstellung am Ende des Beitrags.)Profiling-Setup
Profiling-Code
Ergebnisse für Windows 7 auf Intel i7 CPU, CPython v3.5.0, numpy v1.10.1.
Code-Snippet anzeigen
Siehe auch Ergebnisse für eine Variante der Profilerstellung, bei der der Speicher des Ziels bereits während des Wertkopierens vorab zugewiesen wurde , da dies
y = np.empty_like(x)
Teil des Setups ist:Code-Snippet anzeigen
quelle
x.copy()
ist so schnell wienp.array(x)
und ich mag die Syntax viel mehr:$ python3 -m timeit -s "import numpy as np; x = np.random.random((100, 100))" "x.copy()"
-100000 loops, best of 3: 4.7 usec per loop
. Ich habe ähnliche Ergebnisse fürnp.array(x)
. Getestet unter Linux mit einem i5-4210U und numpy 1.10.4np.copy
mehr verzeiht:np.copy(False)
,np.copy(None)
noch Arbeit, währenda = None; a.copy()
wirftAttributeError: 'NoneType' object has no attribute 'copy'
. Außerdem erklären wir genauer, was in dieser Codezeile geschehen soll, indem wir die Funktion anstelle der Methodensyntax verwenden.np.copy(None)
dass kein Fehler auftritt, ist wirklich unpythonisch. Ein Grund mehr zu verwendena.copy()
:)y[:] = x
jetzt geringfügig schneller ist alscopyto(y, x)
. Code und Ausgabe unter gist.github.com/bhawkins/7cdbd5b9372cb798e34e21f92279d2dcSie können einfach verwenden:
Dies ist der schnellste Weg, hat aber auch einige Probleme. Wenn Sie das nicht direkt definieren
dtype
vona
und auch die nicht überprüft ,dtype
derb
kann in Schwierigkeiten geraten Sie. Beispielsweise:Ich hoffe, ich konnte den Punkt klarstellen. Manchmal wird der Datentyp mit nur einer kleinen Operation geändert.
quelle
a = numpy.zeros(len(b))
oder erstellta = numpy.empty(n,dtype=complex)
auch ein neues Array.Es gibt viele verschiedene Dinge, die Sie tun können:
Dinge, die nicht funktionieren
quelle
Warum nicht verwenden
Ich denke, es ist ähnlich wie bei der vorherigen Multiplikation, könnte aber einfacher sein.
quelle