ich bin für den meisten speichereffizienten Weg, um den absoluten Quadrat-Wert eines komplexen numpy ndarrayDie meisten speichereffiziente Art und Weise abs zu berechnen() ** 2 komplexe numpy ndarray
arr = np.empty((250000, 150), dtype='complex128') # common size
zu berechnen
Ich habe kein ufunc gefunden, das genau np.abs()**2
tun würde.
Da ein Array dieser Größe und Art etwa eine halbe GB benötigt, suche ich nach einer primär speichereffizienten Methode.
Ich möchte auch, dass es tragbar ist, also idealerweise eine Kombination von ufuncs.
Bisher mein Verständnis ist, dass diese
über die bestenresult = np.abs(arr)
result **= 2
sollte es unnötig (**0.5)**2
berechnen wird, soll aber **2
an Ort und Stelle berechnen. Insgesamt ist der Spitzenspeicherbedarf nur die ursprüngliche Array-Größe + Array-Ergebnisgröße, die 1,5 * Original-Array-Größe sein sollte, da das Ergebnis real ist.
Wenn ich loswerden der nutzlos **2
Anruf bekommen wollte würde ich so etwas wie dieses
result = arr.real**2
result += arr.imag**2
zu tun, aber wenn ich mich nicht irre, bedeutet dies, ich werde für Speicher zuweisen haben beide die Berechnung von Real- und Imaginärteil, so würde die maximale Speichernutzung 2.0 * ursprüngliche Array-Größe sein. Die arr.real
-Eigenschaften geben auch ein nicht zusammenhängendes Array zurück (das ist jedoch von geringerer Bedeutung).
Gibt es etwas, was ich vermisse? Gibt es bessere Möglichkeiten, dies zu tun?
EDIT 1: Es tut mir leid für die nicht klar zu machen, will ich nicht, arr zu überschreiben, so kann ich es nicht so aus verwenden.
Ich möchte das als eine Antwort akzeptieren, aber ich bin mir nicht sicher, wie tragbar es ist. Numba ist heutzutage mit Anaconda auf den meisten Rechnern ziemlich einfach zu installieren, aber ich bin mir nicht sicher, wie portierbar die LLVM-Bindungen über Architekturen sind. Vielleicht könnten Sie einige Informationen über die Portabilität dieser Antwort hinzufügen. –
Nun, ich bin LLVM Experte, aber die Dokumentation der aktuellen Version (0.31.0) sagt: Unterstützt werden Linux, Windows 7 und OS X 10.9 und höher. – burnpanck