If I have a numpy dtype, how do I automatically convert it to its closest python data type? For example,
numpy.float32 -> "python float" numpy.float64 -> "python float" numpy.uint32 -> "python int" numpy.int16 -> "python int"
I could try to come up with a mapping of all of these cases, but does numpy provide some automatic way of converting its dtypes into the closest possible native python types? This mapping need not be exhaustive, but it should convert the common dtypes that have a close python analog. I think this already happens somewhere in numpy.
We have a method called astype(data_type) to change the data type of a numpy array. If we have a numpy array of type float64, then we can change it to int32 by giving the data type to the astype() method of numpy array.
We can use NumPy np. array tolist() function to convert an array to a list. If the array is multi-dimensional, a nested list is returned. For a one-dimensional array, a list with the array elements is returned.
The default data type: float_ . The 24 built-in array scalar type objects all convert to an associated data-type object.
Use val.item()
to convert most NumPy values to a native Python type:
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'> ...
(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 love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With