Python >> Tutoriel Python >  >> Python Tag >> Array

Comment réparer "ValueError :la valeur de vérité d'un tableau avec plus d'un élément est ambiguë. Utilisez a.any() ou a.all()"

Voici une erreur que j'ai récemment rencontrée lors de l'utilisation de tableaux NumPy :

Si vous exécutez le code suivant, vous rencontrerez un ValueError spécial :

import numpy as np
a = np.array([1, 2, 3])
b = bool(a)
print(b)

Le résultat sera ce message d'erreur :

# Output:
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

Comment pouvez-vous corriger cette erreur ?

Je vais vous donner une réponse courte et longue à cette question.

Commençons par le court :

Solution :Utiliser les fonctions NumPy logical_and() et logical_or() au lieu des opérateurs logiques de Python "and ” et “or ".

Pour votre commodité, j'ai enregistré une vidéo rapide qui explique toutes les solutions à ce ValueError :

Maîtrisez les bases et rejoignez le cours "Python Built-in Functions" ici :

  • [Cours] 65 fonctions intégrées Python que tout codeur Python doit connaître

Nous discuterons de la réponse longue au fur et à mesure que nous parcourrons l'article. Restez à l'écoute, vous apprendrez quelque chose de nouveau, promis !

Pourquoi l'erreur ValueError se produit-elle ?

De nombreux programmeurs qui commencent à apprendre Numpy pensent qu'ils peuvent utiliser les opérateurs logiques de Python lors de l'écriture de code, mais les créateurs de ce module ont décidé qu'il n'y a pas une seule façon communément comprise d'évaluer un tableau dans un contexte booléen.

Cela pourrait signifier :

  • True si tout l'élément est True , ou
  • True si tous les éléments sont True , ou
  • True si le tableau est de longueur non nulle.

Et nous n'avons mentionné que trois possibilités, il y en a plus !

Étant donné que différents utilisateurs peuvent avoir des besoins et des objectifs différents, les développeurs ont refusé de spéculer et ont décidé d'augmenter le ValueError chaque fois que quelqu'un essaie d'évaluer un tableau dans un contexte booléen.

Alors qu'ont-ils donné en échange ?

Méthode 1 :logical_and() — l'équivalent de "et"

Le logical_and() La fonction est équivalente à la fonction intégrée Python "and ” opérateur logique. Lorsque nous utilisons cette fonction, le programme renverra un tableau avec True et False valeurs.

Cette fonction a deux paramètres cruciaux, c'est-à-dire nos tableaux d'entrée, que nous plaçons après la virgule (dans cet exemple arr_1 < 3 et arr_2 > 3 ).

Prenons l'exemple :

import numpy as np

arr_1 = np.arange(5)
arr_2 = np.arange(6, 10)
arr_3 = np.array(['First', 'Second', 'Third', 'Fourth', 'Fifth'])

mask = np.logical_and(arr_1 < 3, arr_2 > 3)
print(arr_3[mask])

Sortie :

['First' 'Second' 'Third']

Le code imprime les premier, deuxième et troisième éléments du tableau arr_3 , car il remplissait nos conditions arr_1 < 3 et arr_2 > 3 et il s'est avéré que les trois premiers nombres de nos tableaux remplissent les conditions en même temps.

Méthode 2 :logical_or() - l'équivalent de "ou"

La fonctionnalité est la même que la précédente. Il a également deux paramètres les plus importants :les tableaux d'entrée.

La seule différence réside dans le comportement du code étant donné que nous voulons réaliser quelque chose de différent :

import numpy as np

arr_1 = np.arange(5)
arr_2 = np.arange(5, 10)
arr_3 = np.array(['First', 'Second', 'Third', 'Fourth', 'Fifth'])

mask = np.logical_or(arr_1 >= 3, arr_2 < 3)
print(arr_3[mask])

Comme au moins un des éléments en positions 4 et 5 de nos tableaux remplit notre condition, le résultat est le suivant :

['Fourth' 'Fifth']

Méthode 3 :ET logique avec "&" et OU logique avec "|"

Au lieu d'écrire logical_and() ou logical_or() nous pouvons utiliser & et | symboles.

Jetez un oeil à ce code :

import numpy
arr_1 = np.arange(5)
arr_2 = np.arange(5, 10)
arr_3 = np.array(['First', 'Second', 'Third', 'Fourth', 'Fifth'])

# Same functionality as logical_and
mask = np.array((arr_1 < 3) & (arr_2 > 3))
print(arr_3[mask])

# Same functionality as logical_or
mask = np.array((arr_1 >= 3) | (arr_2 < 3))
print(arr_3[mask])

Sortie :

['Fourth' 'Fifth']
['First' 'Second' 'Third']

Comprendre any() et all()

Comme ces deux fonctions apparaissent dans le sujet, voici une explication rapide de ce qu'elles font !

La fonction any() vérifie si l'un des éléments est non nul et all() vérifie si tous les éléments sont non nuls.

Ces fonctions prennent plusieurs paramètres, mais deux sont les plus importants :

Paramètre Description
a Tableau d'entrée ou objet pouvant être converti en tableau.
axis Axe ou axes le long desquels une réduction OU logique est effectuée. La valeur par défaut (axis=None ) consiste à effectuer un OU logique sur toutes les dimensions du tableau d'entrée.

Le axis paramètre peut être négatif, auquel cas il compte du dernier au premier axe.

Examinons l'extrait de code suivant pour voir les variantes NumPy, c'est-à-dire np.any() et np.all() , en action :

arr_1 = np.array([[1, 2, 3, 0],[0, 1, 2, 3]])

print('Outputs of function any')
print(np.any(arr_1))
print(np.any(arr_1, axis=0))
print(np.any(arr_1, axis=1))

print('\nOutputs of function all')
print(np.all(arr_1))
print(np.all(arr_1, axis=0))
print(np.all(arr_1, axis=1))

Sortie :

Outputs of function any:
True
[ True  True  True  True]
[ True  True]
 
Outputs of function all:
False
[False  True  True False]
[False False]

Comme vous pouvez le voir, notre script a vérifié au début si des valeurs le long de l'axe ne sont pas nulles.

💡 Remarque :axis=0 est un axe vertical et axis=1 est un axe horizontal.

Résumé

Nous avons appris pourquoi il y a un ValueError lorsque nous voulons utiliser les opérateurs logiques intégrés à Python ("and ” et “or ") dans les opérations logiques lors de l'utilisation de tableaux.

Ensuite, il y avait deux équivalents de ces opérateurs logiques ("logical_and ” et “logical_or ") et un moyen encore plus rapide d'obtenir le même résultat.

Enfin, les fonctions any() et all() dans le module Numpy ont été expliqués.

Références

  • https://stackoverflow.com/questions/10062954/valueerror-the-truth-value-of-an-array-with-more-than-one-element-is-ambiguous
  • https://numpy.org/doc/1.19/reference/generated/numpy.any
  • https://numpy.org/doc/1.19/reference/generated/numpy.all.html