345 Stimmen

Konvertierung von Numpy-Dtypen in native Python-Typen

Wenn ich einen Numpy-Datentyp habe, wie konvertiere ich ihn automatisch in den nächstliegenden Python-Datentyp? Zum Beispiel,

numpy.float32 -> "python float"
numpy.float64 -> "python float"
numpy.uint32  -> "python int"
numpy.int16   -> "python int"

Ich könnte versuchen, ein Mapping für all diese Fälle zu erstellen, aber bietet numpy eine automatische Möglichkeit, seine dtypes in die nächstmöglichen nativen Python-Typen zu konvertieren? Diese Abbildung muss nicht erschöpfend sein, aber sie sollte die üblichen dTypen konvertieren, die ein nahes Python-Analogon haben. Ich denke, dies geschieht bereits irgendwo in Numpy.

486voto

Mike T Punkte 37614

Verwenden Sie val.item() 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 'int'>
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) Sie ist jedoch seit NumPy 1.16 veraltet).


Für Neugierige: eine Tabelle der Umrechnungen von NumPy-Array Skalare für Ihr System:

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 einige NumPy-Typen, die auf manchen Systemen kein natives Python-Äquivalent haben, darunter: clongdouble , clongfloat , complex192 , complex256 , float128 , longcomplex , longdouble y longfloat . Diese müssen in ihr nächstes NumPy-Äquivalent umgewandelt werden, bevor man .item() .

62voto

tm_lv Punkte 6222

Ich habe einen gemischten Satz von Numpy-Typen und Standard-Python. Da alle Numpy-Typen von numpy.generic Hier erfahren Sie, wie Sie alles in Python-Standardtypen konvertieren können:

if isinstance(obj, numpy.generic):
    return numpy.asscalar(obj)

36voto

v.thorey Punkte 1887

Wenn Sie (numpy.array OR numpy scalar OR native type OR numpy.darray) in einen nativen Typ konvertieren wollen, können Sie einfach tun:

converted_value = getattr(value, "tolist", lambda: value)()

tolist konvertiert Ihren Skalar oder Ihr Array in den nativen Python-Typ. Die Standard-Lambda-Funktion kümmert sich um den Fall, dass value bereits nativ ist.

26voto

Carlos Santos Punkte 286

tolist() ist ein allgemeinerer Ansatz, um dies zu erreichen. Er funktioniert in jedem primitiven dtype und auch in Arrays oder Matrizen.

I ergibt eigentlich keine Liste, wenn es von primitiven Typen aufgerufen wird:

numpy == 1.15.2

>>> import numpy as np

>>> np_float = np.float64(1.23)
>>> print(type(np_float), np_float)
<class 'numpy.float64'> 1.23

>>> listed_np_float = np_float.tolist()
>>> print(type(listed_np_float), listed_np_float)
<class 'float'> 1.23

>>> np_array = np.array([[1,2,3.], [4,5,6.]])
>>> print(type(np_array), np_array)
<class 'numpy.ndarray'> [[1. 2. 3.]
 [4. 5. 6.]]

>>> listed_np_array = np_array.tolist()
>>> print(type(listed_np_array), listed_np_array)
<class 'list'> [[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]]

14voto

unutbu Punkte 769083

Wie wäre es damit:

In [51]: dict([(d, type(np.zeros(1,d).tolist()[0])) for d in (np.float32,np.float64,np.uint32, np.int16)])
Out[51]: 
{<type 'numpy.int16'>: <type 'int'>,
 <type 'numpy.uint32'>: <type 'long'>,
 <type 'numpy.float32'>: <type 'float'>,
 <type 'numpy.float64'>: <type 'float'>}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X