int32
Wie konvertiere ich ein NumPy-Array an float32
Ort und Stelle ? Im Grunde würde ich gerne tun
a = a.astype(numpy.float32)
ohne das Array zu kopieren. Es ist groß.
Der Grund dafür ist, dass ich zwei Algorithmen für die Berechnung von habe a
. Einer von ihnen gibt ein Array von zurück int32
, der andere ein Array von float32
(und dies ist den beiden verschiedenen Algorithmen inhärent). Alle weiteren Berechnungen gehen davon aus, dass a
es sich um ein Array von handelt float32
.
Derzeit mache ich die Konvertierung in einer C-Funktion namens via ctypes
. Gibt es eine Möglichkeit, dies in Python zu tun?
ctypes
ist genauso "in Python" wie Verwendennumpy
. :)Antworten:
Sie können eine Ansicht mit einem anderen Typ erstellen und dann direkt in die Ansicht kopieren:
ergibt
Beachten Sie, dass das Kopieren von
x
nachy
geändert wurde , um anzuzeigen, dass die Konvertierung vorhanden warx
:druckt
quelle
np.arange(10, dtype=np.int32).view(np.float32)
auf Numpy 1.8.2 mache, bekomme icharray([ 0.00000000e+00, 1.40129846e-45, ... [snip] ... 1.26116862e-44], dtype=float32)
.y[:] = x
.a = np.arange(10, dtype='float32'); b = a[::-1]; c = np.vstack((a,b)); d = c.view('float64')
Dieser Code benötigt 10 + 10 float32 und ergibt 10 statt 20 float64x.astype(float)
Konvertierung. Ich würde es nicht empfehlen, es sei denn, Ihr Skript grenzt an MemoryError.Update: Diese Funktion vermeidet das Kopieren nur, wenn dies möglich ist. Daher ist dies nicht die richtige Antwort auf diese Frage. Die Antwort von unutbu ist die richtige.
numpy astype hat ein Kopierflag. Warum sollten wir es nicht benutzen?
quelle
Sie können den Array-Typ ändern, ohne ihn wie folgt zu konvertieren:
Aber zuerst müssen Sie alle Ganzzahlen in etwas ändern, das als entsprechender Float interpretiert wird. Ein sehr langsamer Weg, dies zu tun, wäre die Verwendung des Python-
struct
Moduls wie folgt:... auf jedes Mitglied Ihres Arrays angewendet.
Aber vielleicht wäre ein schnellerer Weg, die ctypeslib-Tools von numpy zu verwenden (mit denen ich nicht vertraut bin).
- bearbeiten -
Da ctypeslib nicht zu funktionieren scheint, würde ich mit der Konvertierung mit der typischen
numpy.astype
Methode fortfahren, aber in Blockgrößen vorgehen, die innerhalb Ihrer Speichergrenzen liegen:... dann ändern Sie den dtype, wenn Sie fertig sind.
Hier ist eine Funktion, die die Aufgabe für kompatible dtypes ausführt (funktioniert nur für dtypes mit gleich großen Elementen) und beliebig geformte Arrays mit Benutzersteuerung über die Blockgröße verarbeitet:
quelle
a.view(numpy.float32)
. Der schwierige Teil ist tatsächlich die Konvertierung der Daten.numpy.ctypeslib
Hilft nur bei der Neuinterpretation der Daten, nicht bei der tatsächlichen Konvertierung.Verwenden Sie view () und den Parameter 'dtype', um das Array zu ändern.
quelle
int
würde diese Antwort die vorhandenen Daten nur als einen anderen Typ interpretieren, was nicht das ist, wonach ich gefragt habe.dtype
,order
undsubok
Anforderungen eine Kopie des Arrays zurück? Ich löse es nicht.Benutze das:
quelle
a = np.subtract(a, 0., dtype=np.float32)
quelle
numpy.subtract
gibt eine Kopie zurück, nicht wahr? Nur der Name wirda
für einen anderen Datenblock wiederverwendet ... Bitte erklären Sie, wenn ich mich irre.