Utilisez val.item()
pour convertir la plupart des valeurs NumPy en un type Python natif:
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 'long'>
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'>
...
(Une autre méthode est np.asscalar(val)
, cependant, elle est obsolète depuis NumPy 1.16).
Pour les curieux, pour construire une table de conversions de scalaires de tableau NumPy pour votre système:
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
Il y a quelques types numpy sans équivalent Python natif sur certains systèmes, y compris: clongdouble
, clongfloat
, complex192
, complex256
, float128
, longcomplex
, longdouble
et longfloat
. Ceux-ci doivent être convertis en leur équivalent NumPy le plus proche avant utilisation .item()
.
np.str
n'est pas un type Numpy, c'est-à-direnp.str is str
qu'il s'agit simplement d'un alias à un type Python standard. Même avecnp.float
,np.int
,np.bool
,np.complex
etnp.object
. Les types Numpy ont une fin_
, par exemplenp.str_
.np.float64(0).item()
et aussinp.float(0).item()
. En d'autres termes, pour les cas où l'on sait quoi faire, prenez en charge la.item()
méthode même si elle renvoie simplement la même valeur. De cette façon, je pourrais appliquer.item()
sur des scalaires beaucoup plus engourdis sans boîtier spécial. En l'état, des concepts apparemment parallèles diffèrent en raison de la mise en œuvre sous-jacente. Je comprends parfaitement pourquoi cela a été fait. Mais c'est une gêne pour l'utilisateur de la bibliothèque.me suis retrouvé avec un ensemble mixte de types numpy et de python standard. comme tous les types numpy dérivent de
numpy.generic
, voici comment vous pouvez tout convertir en types standard python:la source
np.asscalar()
méthode. Pourquoi? Probablement sans raison évidente. Malgré une décennie de stabilité relative, l'API NumPy est désormais une cible mobile instable nécessitant une maintenance constante des applications en aval. Au moins, ils nous ont laissé laitem()
méthode ... pour l'instant.if isinstance(o, numpy.generic): return o.item() raise TypeError
et elle se transforme à nouveau en une réponse non obsolète: DSi vous voulez convertir (numpy.array OU scalp numpy OU type natif OU numpy.darray) en type natif, vous pouvez simplement faire:
tolist convertira votre scalaire ou tableau en type natif python. La fonction lambda par défaut prend en charge le cas où la valeur est déjà native.
la source
lambda: value
que nous ne voulons aucune entrée.getattr
+ letolist
combo n'est pas seulement universel, mais même vectorisé! (unlinke .item ())Que diriez-vous:
la source
np.dtype('mint8')
pour tout entier positifm
. Il ne peut pas y avoir de cartographie exhaustive. (Je ne crois pas non plus qu'il existe une fonction intégrée pour effectuer cette conversion pour vous. Je peux me tromper, mais je ne pense pas :))>>> print([numpy.asscalar(x) for x in numpy.linspace(1.0, 0.0, 21)]) [1.0, 0.95, 0.9, 0.85, 0.8, 0.75, 0.7, 0.6499999999999999, 0.6, 0.55, 0.5, 0.44999999999999996, 0.3999999999999999, 0.35, 0.29999999999999993, 0.25, 0.19999999999999996, 0.1499999999999999, 0.09999999999999998, 0.04999999999999993, 0.0]
comme vous le voyez, toutes les valeurs n'ont pas été correctement converties.>>> print([numpy.asscalar(round(x,2)) for x in numpy.linspace(1.0, 0.0, 21)]) [1.0, 0.95, 0.9, 0.85, 0.8, 0.75, 0.7, 0.65, 0.6, 0.55, 0.5, 0.45, 0.4, 0.35, 0.3, 0.25, 0.2, 0.15, 0.1, 0.05, 0.0]
tolist()
est une approche plus générale pour y parvenir. Il fonctionne dans n'importe quel type primitif et également dans des tableaux ou des matrices.Je ne donne pas réellement de liste s'il est appelé à partir de types primitifs:
numpy == 1.15.2
la source
Vous pouvez également appeler la
item()
méthode de l'objet que vous souhaitez convertir:la source
Je pense que vous pouvez simplement écrire une fonction de conversion de type général comme ceci:
Cela signifie qu'il n'y a pas de listes fixes et que votre code évoluera avec plus de types.
la source
numpy.ndarray
avec 1 zéro en utilisantzeros()
et d'appeler landarrays
tolist()
fonction à convertir en types natifs. Une fois dans les types natifs, je demande le type et le retourne.tolist()
est une fonction dundarray
grep -r 'tolist' numpy
. (toujours en cours, numpy est énorme!)numpy contient ces informations dans un mappage exposées de
typeDict
manière à ce que vous puissiez faire quelque chose comme ci-dessous:Si vous voulez les types python réels plutôt que leurs noms, vous pouvez faire:
la source
Désolé de venir tard en partie, mais je cherchais un problème de conversion
numpy.float64
en Python normalfloat
uniquement. J'ai vu 3 façons de le faire:npValue.item()
npValue.astype(float)
float(npValue)
Voici les horaires pertinents d'IPython:
Cela
float(npValue)
semble beaucoup plus rapide.la source
Mon approche est un peu énergique, mais semble bien jouer dans tous les cas:
Usage:
la source
Une note latérale sur les scalaires de tableau pour ceux qui n'ont pas besoin de conversion automatique et connaissent le type numpy de la valeur:
La source
Ainsi, dans la plupart des cas, la conversion peut ne pas être nécessaire du tout et le scalaire du tableau peut être utilisé directement. L'effet doit être identique à l'utilisation du scalaire Python:
Mais si, pour une raison quelconque, la conversion explicite est nécessaire, l'utilisation de la fonction intégrée Python correspondante est la solution. Comme indiqué dans l'autre réponse, il est également plus rapide que la
item()
méthode scalaire de tableau .la source
Traduisez le ndarray entier à la place d'un objet de données unitaire:
Cependant, cela prend quelques minutes lors de la manipulation de grandes trames de données. Je recherche également une solution plus efficace. J'espère une meilleure réponse.
la source