2012-03-30 13 views
9

Es gibt eine Reihe von Posts, die das fast beantworten, aber entweder ich verstehe sie nicht oder sie beantworten die Frage nicht:Wie ändere ich den Typ eines numpy recarray?

Ich habe ein recarray mit numpy.rec.fromrecords gemacht. Angenommen, ich möchte bestimmte Spalten in Floats umwandeln. Wie mache ich das? Sollte ich zu einem Ndray wechseln und sie zurück zu einem Nachschub? Hier

Antwort

14

ist ein Beispiel astype mit der Umwandlung auszuführen:

import numpy as np 
recs = [('Bill', '31', 260.0), ('Fred', 15, '145.0')] 
r = np.rec.fromrecords(recs, formats = 'S30,i2,f4', names = 'name, age, weight') 
print(r) 
# [('Bill', 31, 260.0) ('Fred', 15, 145.0)] 

Die age ist von dtype <i2:

print(r.dtype) 
# [('name', '|S30'), ('age', '<i2'), ('weight', '<f4')] 

Wir können das ändern zu <f4astype mit:

r = r.astype([('name', '|S30'), ('age', '<f4'), ('weight', '<f4')]) 
print(r) 
# [('Bill', 31.0, 260.0) ('Fred', 15.0, 145.0)] 
+0

Danke! Der "Astype" ist etwas kompakter als das Erstellen eines neuen Arrays ... Ich gehe davon aus, dass es hinsichtlich der Effizienz dasselbe ist. Ich poste auch meine Lösung unten, da es enthält, wie man einen vorhandenen dtype ändert. – mathtick

11

Dort a im Grunde zwei Schritte. Mein Stolperstein war zu finden, wie man einen vorhandenen dtype ändert. So habe ich es gemacht:

# change dtype by making a whole new array 
dt = data.dtype 
dt = dt.descr # this is now a modifiable list, can't modify numpy.dtype 
# change the type of the first col: 
dt[0] = (dt[0][0], 'float64') 
dt = numpy.dtype(dt) 
# data = numpy.array(data, dtype=dt) # option 1 
data = data.astype(dt) 
Verwandte Themen