web-dev-qa-db-fra.com

Convertir la liste ou le tableau numpy d'un seul élément en flottant dans python

J'ai une fonction qui peut accepter une liste ou un tableau numpy.

Dans les deux cas, la liste/tableau a un seul élément (toujours). J'ai juste besoin de retourner un flotteur.

Ainsi, par exemple, je pourrais recevoir:

list_ = [4]

ou le tableau numpy:

array_ = array([4])

Et je devrais revenir

 4.0

Donc, naturellement (je dirais), j'utilise float (...) sur list_ et j'obtiens:

TypeError: float() argument must be a string or a number

Je fais de même pour array_ et cette fois cela fonctionne en répondant avec "4.0". De cela, j'apprends que la liste de Python ne peut pas être convertie pour flotter de cette façon.

Basé sur le succès de la conversion du tableau numpy pour flotter, cela m'a conduit à l'approche:

float(np.asarray(list_))

Et cela fonctionne lorsque list_ est à la fois une liste Python et lorsqu'il s'agit d'un tableau numpy.

Question

Mais il semble que cette approche ait une surcharge convertissant d'abord la liste en un tableau numpy puis flottant. Fondamentalement: existe-t-il une meilleure façon de procéder?

18
denvar

Accédez simplement au premier élément de la liste/du tableau, en utilisant l'accès à l'index et l'index 0:

>>> list_ = [4]
>>> list_[0]
4
>>> array_ = np.array([4])
>>> array_[0]
4

Ce sera un int puisque c'est ce que vous avez inséré en premier lieu. Si vous en avez besoin pour un flottant pour une raison quelconque, vous pouvez appeler float() dessus alors:

>>> float(list_[0])
4.0
21
poke

Vous voudrez peut-être utiliser la méthode ndarray.item , comme dans a.item(). Cela équivaut également à np.asscalar(a) . Cela a l'avantage de travailler dans des situations avec des vues et des axes superflus, alors que les solutions ci-dessus vont actuellement se casser. Par exemple,

>>> a = np.asarray(1).view()
>>> a.item()  # correct
1

>>> a[0]  # breaks
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: too many indices for array


>>> a = np.asarray([[2]])
>>> a.item()  # correct
2

>>> a[0]  # bad result
array([2])

Cela a également l'avantage de lever une exception si le tableau n'est pas un singleton, tandis que l'approche a[0] Se poursuivra silencieusement (ce qui peut conduire à des bogues se faufilant sans être détectés).

>>> a = np.asarray([1, 2])
>>> a[0]  # silently proceeds
1
>>> a.item()  # detects incorrect size
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: can only convert an array of size 1 to a Python scalar
16
Aaron Voelker

Utilisez numpy.asscalar pour convertir un tableau/matrice numpy en valeur scalaire:

>>> a=numpy.array([[[[42]]]])
>>> numpy.asscalar(a)
42

Le type de données en sortie est le même que celui renvoyé par la méthode item de l'entrée.

Il a intégré la vérification des erreurs s'il y a plus d'un seul élément:

>>> a=numpy.array([1, 2])
>>> numpy.asscalar(a)

donne:

ValueError: can only convert an array of size 1 to a Python scalar

Remarque: l'objet passé à asscalar doit répondre à item, donc passer une liste ou un Tuple ne fonctionnera pas.

6
Tom Hale

J'utiliserais simplement,

np.asarray(input, dtype=np.float)[0]
  • Si input est un ndarray du bon type, il n'y a pas de surcharge, puisque np.asarray ne fait rien dans ce cas.
  • si input est un list, np.asarray s'assure que la sortie est du bon type.
2
rth