Converting numpy dtypes to native python types Converting numpy dtypes to native python types python python

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().


found myself having mixed set of numpy types and standard python. as all numpy types derive from numpy.generic, here's how you can convert everything to python standard types:

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


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.