web-dev-qa-db-fra.com

Utilisez a.any () ou a.all ()

x = np.arange(0,2,0.5)
valeur = 2*x

if valeur <= 0.6:
    print ("this works")
else:   
    print ("valeur is too high")

voici l'erreur que je reçois:

if valeur <= 0.6:
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

J'ai lu plusieurs articles sur a.any () ou a.all () mais je ne parviens toujours pas à trouver un moyen d'expliquer clairement comment résoudre le problème. Je vois pourquoi Python n'aime pas ce que j'ai écrit mais je ne sais pas comment le corriger.

48
Moe Steen

Si vous regardez le résultat de valeur <= 0.6, vous pouvez voir ce qui cause cette ambiguïté:

>>> valeur <= 0.6
array([ True, False, False, False], dtype=bool)

Le résultat est donc un autre tableau qui a dans ce cas 4 valeurs booléennes. Maintenant, quel devrait être le résultat? La condition doit-elle être vraie lorsqu'une valeur est vraie? La condition doit-elle être vraie seulement quand toutes les valeurs sont vraies?

C’est exactement ce que numpy.any et numpy.all font. La première nécessite au moins une valeur vraie, la dernière exige que toutes les valeurs soient vraies:

>>> np.any(valeur <= 0.6)
True
>>> np.all(valeur <= 0.6)
False
66
poke

Vous commentez:

valeur est un vecteur égal à [0. 1. 2. 3.] Je m'intéresse à chaque terme. Pour la partie en dessous de 0.6, alors retournez "ça marche" ....

Si vous êtes intéressé par chaque terme, écrivez le code pour qu’il traite de chaque terme. Par exemple.

for b in valeur<=0.6:
    if b:
        print ("this works")
    else:   
        print ("valeur is too high")

Cela va écrire 2 lignes.

L'erreur est générée par le code numpy lorsque vous essayez de l'utiliser dans un contexte qui attend une seule valeur scalaire. if b:... ne peut faire qu'une chose. Cela ne suffit pas, en soi, à parcourir les éléments de b à faire une chose différente pour chacun.

Vous pouvez également utiliser cette itération sous forme de compréhension de liste, par exemple.

['yes' if b else 'no' for b in np.array([True, False, True])]
4
hpaulj