366 votes

Conversion de types numpy en types python natifs

Si j'ai un type numpy, comment puis-je le convertir automatiquement en son type de données python le plus proche? Par exemple,

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

Je pourrais essayer de faire un mappage de tous ces cas, mais numpy fournit-il un moyen automatique de convertir ses types de types en types fermés de python natif? Ce mappage n’a pas besoin d’être exhaustif, mais il doit convertir les types courants qui ont un analogue python proche. Je pense que cela se produit déjà quelque part numpy.

518voto

Mike T Points 7385

Utiliser a.item() ou np.asscalar(a) pour convertir la plupart des NumPy valeurs des autochtones Python de type:

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)))  # <type 'datetime.datetime'>
type(np.asscalar(np.timedelta64(0))) # <type 'datetime.timedelta'>
...

Lire plus dans le NumPy manuel. Pour les curieux, pour construire un tableau de conversions pour votre système:

for name in dir(np):
    obj = getattr(np, name)
    if hasattr(obj, 'dtype'):
        try:
            npn = obj(0)
            nat = npn.item()
            print('%s (%r) -> %s'%(name, npn.dtype.char, type(nat)))
        except:
            pass

Il y a quelques NumPy types qui n'ont pas natif Python équivalent sur certains systèmes, y compris: clongdouble, clongfloat, complex192, complex256, float128, longcomplex, longdouble et longfloat. Ces le besoin d'être convertis à leur plus proche NumPy équivalent avant d'utiliser asscalar.

64voto

tm_lv Points 1421

je me suis retrouvé avec un ensemble mixte de types numpy et de python standard. comme tous les types numpy proviennent de numpy.generic , voici comment vous pouvez tout convertir en types standard python:

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

14voto

unutbu Points 222216

Que diriez-vous:

 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'>}
 

10voto

Aryeh Leib Taurog Points 867

Vous pouvez également appeler la méthode item() de l'objet que vous souhaitez convertir:

 >>> from numpy import float32, uint32
>>> type(float32(0).item())
<type 'float'>
>>> type(uint32(0).item())
<type 'long'>
 

8voto

Matt Alcock Points 1913

Je pense que vous pouvez simplement écrire une fonction de conversion de type général comme ceci:

 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'>)
 

Cela signifie qu'il n'y a pas de listes fixes et que votre code évoluera avec plus de types.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X