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?
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
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
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.
J'utiliserais simplement,
np.asarray(input, dtype=np.float)[0]
input
est un ndarray
du bon type, il n'y a pas de surcharge, puisque np.asarray
ne fait rien dans ce cas.input
est un list
, np.asarray
s'assure que la sortie est du bon type.