float128 - Convirtiendo los dtypes numpy a tipos nativos de python
numpy float128 (7)
Si tengo un tipo numpy, ¿cómo lo convierto automáticamente en su tipo de datos python más cercano? Por ejemplo,
numpy.float32 -> "python float"
numpy.float64 -> "python float"
numpy.uint32 -> "python int"
numpy.int16 -> "python int"
Podría tratar de encontrar un mapeo de todos estos casos, pero ¿numpy proporciona alguna forma automática de convertir sus dtypes en los tipos de python nativos más cercanos posibles? Este mapeo no tiene que ser exhaustivo, pero debería convertir los dtypes comunes que tienen un análogo cercano de python. Creo que esto ya sucede en algún lugar en numpy.
Creo que puedes simplemente escribir la función de conversión de tipo general así:
import numpy as np
def get_type_convert(np_type):
convert_type = type(np.zeros(1,np_type).tolist()[0])
return (np_type, convert_type)
print get_type_convert(np.float32)
>> (<type ''numpy.float32''>, <type ''float''>)
print get_type_convert(np.float64)
>> (<type ''numpy.float64''>, <type ''float''>)
Esto significa que no hay listas fijas y su código se escalará con más tipos.
Qué tal si:
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''>}
Si desea convertir (numpy.array O numpy escalar OR nativo tipo O numpy.darray) A tipo nativo simplemente puede hacer:
converted_value = getattr(value, "tolist", lambda x=value: x)()
tolist convertirá su escalar o arreglo a tipo nativo de pitón. La función lambda predeterminada se ocupa del caso en que el valor ya es nativo.
También puede llamar al a.item() del objeto que desea convertir:
>>> from numpy import float32, uint32
>>> type(float32(0).item())
<type ''float''>
>>> type(uint32(0).item())
<type ''long''>
Utilice a.item()
o np.asscalar(a)
para convertir la mayoría de los valores de NumPy a un tipo de Python nativo:
import numpy as np
# examples using a.item()
type(np.float32(0).item()) # <type ''float''>
type(np.float64(0).item()) # <type ''float''>
type(np.uint32(0).item()) # <type ''long''>
# examples using np.asscalar(a)
type(np.asscalar(np.int16(0))) # <type ''int''>
type(np.asscalar(np.cfloat(0))) # <type ''complex''>
type(np.asscalar(np.datetime64(0, ''D''))) # <type ''datetime.datetime''>
type(np.asscalar(np.timedelta64(0, ''D''))) # <type ''datetime.timedelta''>
...
Lea más en el manual de NumPy . Para los curiosos, para construir una tabla de conversiones para su sistema:
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
Hay algunos tipos de NumPy que no tienen equivalente nativo de Python en algunos sistemas, incluidos: clongdouble
, clongfloat
, complex192
, complex256
, float128
, longcomplex
, longdouble
y longfloat
. Estos deben convertirse a su equivalente NumPy más cercano antes de usar asscalar
.
me encontré con un conjunto mixto de tipos numpy y python estándar. como todos los tipos numpy se derivan de numpy.generic
, aquí le numpy.generic
cómo puede convertir todo en tipos estándar de python:
if isinstance(obj, numpy.generic):
return numpy.asscalar(obj)
numpy mantiene esa información en un mapeo expuesto como typeDict
para que puedas hacer algo como lo siguiente ::
>>> import __builtin__
>>> import numpy as np
>>> {v: k for k, v in np.typeDict.items() if k in dir(__builtin__)}
{numpy.object_: ''object'',
numpy.bool_: ''bool'',
numpy.string_: ''str'',
numpy.unicode_: ''unicode'',
numpy.int64: ''int'',
numpy.float64: ''float'',
numpy.complex128: ''complex''}
Si desea los tipos de python reales en lugar de sus nombres, puede hacer ::
>>> {v: getattr(__builtin__, k) for k, v in np.typeDict.items() if k in vars(__builtin__)}
{numpy.object_: object,
numpy.bool_: bool,
numpy.string_: str,
numpy.unicode_: unicode,
numpy.int64: int,
numpy.float64: float,
numpy.complex128: complex}