Converting numpy dtypes to native python types
Use val.item()
to convert most NumPy values to a native Python type:
import numpy as np# for example, numpy.float32 -> python floatval = 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'>...
(Another method is np.asscalar(val)
, however it is deprecated since NumPy 1.16).
For the curious, to build a table of conversions of NumPy array scalars for your 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
There are a few NumPy types that have no native Python equivalent on some systems, including: clongdouble
, clongfloat
, complex192
, complex256
, float128
, longcomplex
, longdouble
and longfloat
. These need to be converted to their nearest NumPy equivalent before using .item()
.
If you want to convert (numpy.array OR numpy scalar OR native type OR numpy.darray) TO native type you can simply do :
converted_value = getattr(value, "tolist", lambda: value)()
tolist will convert your scalar or array to python native type. The default lambda function takes care of the case where value is already native.