Verwenden Sie val.item()
diese Option, um die meisten NumPy-Werte in einen nativen Python-Typ zu konvertieren:
import numpy as np
# for example, numpy.float32 -> python float
val = np.float32(0)
pyval = val.item()
print(type(pyval)) # <class 'float'>
# and similar...
type(np.float64(0).item()) # <class 'float'>
type(np.uint32(0).item()) # <class 'long'>
type(np.int16(0).item()) # <class 'int'>
type(np.cfloat(0).item()) # <class 'complex'>
type(np.datetime64(0, 'D').item()) # <class 'datetime.date'>
type(np.datetime64('2001-01-01 00:00:00').item()) # <class 'datetime.datetime'>
type(np.timedelta64(0, 'D').item()) # <class 'datetime.timedelta'>
...
(Eine andere Methode ist np.asscalar(val)
jedoch seit NumPy 1.16 veraltet).
Für Neugierige, um eine Tabelle mit Konvertierungen von NumPy-Array-Skalaren für Ihr System zu erstellen :
for name in dir(np):
obj = getattr(np, name)
if hasattr(obj, 'dtype'):
try:
if 'time' in name:
npn = obj(0, 'D')
else:
npn = obj(0)
nat = npn.item()
print('{0} ({1!r}) -> {2}'.format(name, npn.dtype.char, type(nat)))
except:
pass
Es gibt ein paar NumPy Typen , die keine native Python Äquivalent auf einigen Systemen, einschließlich: clongdouble
, clongfloat
, complex192
, complex256
, float128
, longcomplex
, longdouble
und longfloat
. Diese müssen vor der Verwendung in das nächste NumPy-Äquivalent konvertiert werden .item()
.
np.str
ist kein Numpy-Typ, dhnp.str is str
es ist nur ein Alias für einen Standard-Python-Typ. Das Gleiche gilt fürnp.float
,np.int
,np.bool
,np.complex
, undnp.object
. Die Numpy-Typen haben ein Trailing_
, znp.str_
.np.float64(0).item()
und auchnp.float(0).item()
. Mit anderen Worten, für die Fälle, in denen bekannt ist, was zu tun ist, unterstützen Sie die.item()
Methode, auch wenn sie einfach denselben Wert zurückgibt. Auf diese Weise konnte ich.item()
ohne spezielle Hülle auf weitaus mehr numpy Skalare auftragen. Scheinbar parallele Konzepte unterscheiden sich aufgrund der zugrunde liegenden Implementierung. Ich verstehe vollkommen, warum dies getan wurde. Aber es ist ein Ärger für den Bibliotheksbenutzer.Ich hatte eine gemischte Reihe von Numpy-Typen und Standard-Python. Da alle Numpy-Typen abgeleitet sind
numpy.generic
, können Sie wie folgt alles in Python-Standardtypen konvertieren:quelle
np.asscalar()
Methode abgelehnt . Warum? Wahrscheinlich ohne erkennbaren Grund. Trotz eines Jahrzehnts relativer Stabilität ist die NumPy-API jetzt ein instabiles bewegliches Ziel, das eine ständige Wartung durch nachgeschaltete Anwendungen erfordert. Zumindest haben sie uns dieitem()
Methode überlassen ... für jetzt.if isinstance(o, numpy.generic): return o.item() raise TypeError
und sie wird wieder zu einer nicht veralteten Antwort: DWenn Sie (numpy.array ODER numpy scalar ODER nativer Typ ODER numpy.darray) in einen nativen Typ konvertieren möchten, können Sie einfach Folgendes tun:
tolist konvertiert Ihren Skalar oder Ihr Array in den nativen Python-Typ. Die Standard-Lambda-Funktion kümmert sich um den Fall, dass der Wert bereits nativ ist.
quelle
lambda: value
wir keine Eingaben wollen.getattr
+tolist
Combo ist nicht nur universell, sondern sogar vektorisiert! (unlinke .item ())Wie wäre es mit:
quelle
np.dtype('mint8')
jede positive Ganzzahlm
. Es kann keine erschöpfende Zuordnung geben. (Ich glaube auch nicht, dass es eine eingebaute Funktion gibt, um diese Konvertierung für Sie durchzuführen. Ich könnte mich irren, aber ich denke nicht :))>>> print([numpy.asscalar(x) for x in numpy.linspace(1.0, 0.0, 21)]) [1.0, 0.95, 0.9, 0.85, 0.8, 0.75, 0.7, 0.6499999999999999, 0.6, 0.55, 0.5, 0.44999999999999996, 0.3999999999999999, 0.35, 0.29999999999999993, 0.25, 0.19999999999999996, 0.1499999999999999, 0.09999999999999998, 0.04999999999999993, 0.0]
Wie Sie sehen, wurden nicht alle Werte korrekt konvertiert.>>> print([numpy.asscalar(round(x,2)) for x in numpy.linspace(1.0, 0.0, 21)]) [1.0, 0.95, 0.9, 0.85, 0.8, 0.75, 0.7, 0.65, 0.6, 0.55, 0.5, 0.45, 0.4, 0.35, 0.3, 0.25, 0.2, 0.15, 0.1, 0.05, 0.0]
tolist()
ist ein allgemeinerer Ansatz, um dies zu erreichen. Es funktioniert in jedem primitiven Typ und auch in Arrays oder Matrizen.Ich erhalte keine Liste, wenn ich von primitiven Typen aufgerufen werde:
numpy == 1.15.2
quelle
Sie können auch die
item()
Methode des Objekts aufrufen, das Sie konvertieren möchten:quelle
Ich denke, Sie können einfach eine allgemeine Typkonvertierungsfunktion wie folgt schreiben:
Dies bedeutet, dass es keine festen Listen gibt und Ihr Code mit mehr Typen skaliert wird.
quelle
numpy.ndarray
mit 1 Null darin generierezeros()
und diendarrays
tolist()
Funktion aufrufe, um sie in native Typen zu konvertieren. Einmal in nativen Typen frage ich nach dem Typ und gebe ihn zurück.tolist()
ist eine Funktion derndarray
grep -r 'tolist' numpy
. (noch in Bearbeitung, numpy ist massiv!)numpy enthält diese Informationen in einem Mapping,
typeDict
damit Sie so etwas wie das Folgende tun können:Wenn Sie die tatsächlichen Python-Typen anstelle ihrer Namen möchten, können Sie Folgendes tun:
quelle
Es tut mir leid, dass ich zu spät zum Teil gekommen bin, aber ich habe mir ein Problem mit der Konvertierung nur
numpy.float64
in reguläres Python angesehenfloat
. Ich habe 3 Möglichkeiten gesehen, das zu tun:npValue.item()
npValue.astype(float)
float(npValue)
Hier sind die relevanten Timings von IPython:
Es klingt wie
float(npValue)
scheint viel schneller.quelle
Mein Ansatz ist ein bisschen energisch, scheint aber in allen Fällen gut zu spielen:
Verwendung:
quelle
Eine Randnotiz zu Array-Skalaren für diejenigen, die keine automatische Konvertierung benötigen und den numpy dtype des Werts kennen:
Quelle
In den meisten Fällen ist daher möglicherweise überhaupt keine Konvertierung erforderlich, und der Array-Skalar kann direkt verwendet werden. Der Effekt sollte mit der Verwendung des Python-Skalars identisch sein:
Wenn jedoch aus irgendeinem Grund die explizite Konvertierung erforderlich ist, ist die Verwendung der entsprechenden integrierten Python-Funktion der richtige Weg. Wie in der anderen Antwort gezeigt, ist es auch schneller als die Array-Skalarmethode
item()
.quelle
Übersetzen Sie stattdessen das gesamte ndarray ein Einheitsdatenobjekt:
Bei der Verarbeitung großer Datenrahmen dauert es jedoch einige Minuten. Ich suche auch nach einer effizienteren Lösung. Hoffe eine bessere Antwort.
quelle