2015-12-26 5 views
27
x = np.arange(0,2,0.5) 
valeur = 2*x 

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

tu jest błąd pojawia się:Zastosowanie a.any() lub a.all()

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

Przeczytałem kilka postów o a.any() lub(), ale a.all nadal nie może znaleźć sposobu, który naprawdę wyjaśniłby, jak rozwiązać problem. Rozumiem, dlaczego Python nie lubi tego, co napisałem, ale nie jestem pewien, jak to naprawić.

+4

'valeur' to wektor z elementami mniejszymi niż 0,6 i niektórymi większymi. Co masz na myśli z 'valeur <= 0.6'? – Daniel

+0

valeur to wektor równy [0. 1. 2. 3.] Jestem zainteresowany każdym pojedynczym terminem. Dla części poniżej 0.6, następnie zwróć "to działa". Dla części powyżej 0,6, zwróć "valeur jest zbyt wysoki" to jest głupi dół wersja, gdzie zamiast Wydrukuj to lub Drukuj, że w oparciu o warunek, jestem karmienia każdego elementu Valeur do równania 1 lub równania 2 w zależności od stanu –

+2

porównywanie pojedynczej wartości z wektorem jest podobne do porównywania pomarańczy i jabłek, "any()" i "all()" są funkcjami, które sprawdzają, czy warunek ten jest spełniony przez którykolwiek z elementów w wektorze, czy też wszystkie elementy spełniają stan – saljuama

Odpowiedz

41

Jeśli spojrzeć na wynik valeur <= 0.6 można zobaczyć, co jest przyczyną tej dwuznaczności:

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

Więc wynik jest inna tablica, która ma w tym przypadku 4 wartości logiczne. Jaki powinien być wynik? Czy warunek musi być spełniony, gdy jedna wartość jest prawdziwa? Czy warunek powinien być spełniony tylko wtedy, gdy wszystkie wartości są prawdziwe?

To właśnie robią numpy.any i numpy.all. Były wymaga co najmniej jedną prawdziwą wartość, to ostatnie wymaga, aby wszystkie wartości są prawdziwe:

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

można skomentować:

valeur jest wektorem równa [0. 1. 2. 3.] Jestem zainteresowany każdym pojedynczym terminem. W przypadku części poniżej 0,6, zwróć "to działa" ...

Jeśli jesteś zainteresowany każdym terminem, to napisz ten kod, aby poradził sobie z każdym z nich. Na przykład.

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

Spowoduje to napisanie 2 linii.

Błąd jest generowany przez kod numpy przy próbie użycia go w kontekście, który oczekuje pojedynczej, skalarnej wartości. if b:... może zrobić tylko jedno. Sam w sobie nie iteruje poprzez elementy b, robiąc dla każdego inną rzecz.

Można również rzutować tę iterację jako spis treści, np.

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