ValueError: Der Wahrheitswert eines Arrays mit mehr als einem Element ist mehrdeutig. Verwenden Sie a.any() oder a.all()

Lesezeit: 7 Minuten

Benutzer-Avatar
Homunculus Reticulli

Lassen x ein NumPy-Array sein. Folgende:

(x > 1) and (x < 3)

Gibt die Fehlermeldung:

ValueError: Der Wahrheitswert eines Arrays mit mehr als einem Element ist mehrdeutig. Verwenden Sie a.any() oder a.all()

Wie behebe ich das?

Benutzer-Avatar
unutbu

Wenn a und b sind Boolesche NumPy-Arrays, die & Die Operation gibt das elementweise zurück und von ihnen:

a & b

Das gibt einen booleschen Wert zurück Reihe. Um dies auf einen einzigen booleschen Wert zu reduzieren Wertbenutze das eine oder das andere

(a & b).any()

oder

(a & b).all()

Hinweis: Wenn a und b sind Nicht-Boolesch Arrays, betrachten (a - b).any() oder (a - b).all() stattdessen.


Begründung

Die NumPy-Entwickler waren der Meinung, dass es keinen allgemein verständlichen Weg gibt, ein Array im booleschen Kontext auszuwerten: es könnte bedeuten True wenn irgendein Element ist Trueoder es könnte bedeuten True wenn alle Elemente sind Trueoder True wenn das Array eine Länge ungleich Null hat, um nur drei Möglichkeiten zu nennen.

Da verschiedene Benutzer möglicherweise unterschiedliche Bedürfnisse und unterschiedliche Annahmen haben, weigerten sich die NumPy-Entwickler zu raten und entschieden sich stattdessen, a zu erheben ValueError wenn man versucht, ein Array im booleschen Kontext auszuwerten. Bewirbt sich and to two numpy Arrays bewirkt, dass die beiden Arrays im booleschen Kontext ausgewertet werden (durch Aufrufen von __bool__ in Python3 bzw __nonzero__ in Python2).

  • Sie haben Recht. Der ursprüngliche Code war korrekt. Der Fehler scheint an einer anderen Stelle im Code zu liegen.

    – Homunculus Reticulli

    8. April 2012 um 13:22 Uhr

  • Ausgezeichnete Erklärung. Dies impliziert jedoch, dass NumPy ziemlich ineffizient ist: Es wertet beide booleschen Arrays vollständig aus, während eine effiziente Implementierung cond1(i)&&cond2(i) in einer einzigen Schleife auswerten und cond2 überspringen würde, sofern cond1 nicht wahr ist.

    – Joachim W

    19. August 2013 um 7:18 Uhr

  • @JoachimWuttke: Obwohl np.all und np.any kurzschlussfähig sind, wird das übergebene Argument vorher ausgewertet np.all oder np.any hat die Chance auf einen Kurzschluss. Um es besser zu machen, müssten Sie derzeit spezialisierten C/Cython-Code schreiben ähnlich wie dies.

    – unutbu

    19. August 2013 um 13:22 Uhr

  • Das ist nicht der beste Zug, den sie tun könnten … and und & sind überhaupt nicht dasselbe, und sie haben nicht einmal die gleiche Priorität.

    – Kamion

    4. Juli 2020 um 17:15 Uhr

Benutzer-Avatar
Yeqing Zhang

Ich hatte das gleiche Problem (dh Indizierung mit mehreren Bedingungen, hier werden Daten in einem bestimmten Datumsbereich gefunden). Das (a-b).any() oder (a-b).all() scheinen nicht zu funktionieren, zumindest bei mir.

Alternativ habe ich eine andere Lösung gefunden, die perfekt für meine gewünschte Funktionalität funktioniert (Der Wahrheitswert eines Arrays mit mehr als einem Element ist mehrdeutig, wenn versucht wird, ein Array zu indizieren).

Anstatt den oben vorgeschlagenen Code zu verwenden, verwenden Sie:

numpy.logical_and(a, b)

Benutzer-Avatar
MSeifert

Der Grund für die Ausnahme ist das and ruft implizit auf bool. Zuerst auf den linken Operanden und (wenn der linke Operand ist True) dann auf den rechten Operanden. So x and y ist äquivalent zu bool(x) and bool(y).

Jedoch die bool auf einen numpy.ndarray (wenn es mehr als ein Element enthält) löst die Ausnahme aus, die Sie gesehen haben:

>>> import numpy as np
>>> arr = np.array([1, 2, 3])
>>> bool(arr)
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

Das bool() Anruf ist implizit enthalten andaber auch drin if, while, orsodass jedes der folgenden Beispiele ebenfalls fehlschlägt:

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

>>> if arr: pass
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

>>> while arr: pass
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

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

Es gibt mehr Funktionen und Anweisungen in Python, die sich verstecken bool Anrufe zum Beispiel 2 < x < 10 ist nur eine andere Art zu schreiben 2 < x and x < 10. Und die and werde anrufen bool: bool(2 < x) and bool(x < 10).

Das elementweise Äquivalent für and wäre das np.logical_and Funktion, ähnlich könnten Sie verwenden np.logical_or als Äquivalent für or.

Für boolesche Arrays – und Vergleiche wie <, <=, ==, !=, >= und > on NumPy-Arrays geben boolesche NumPy-Arrays zurück – Sie können auch die verwenden elementweise bitweise Funktionen (und Operatoren): np.bitwise_and (& Operator)

>>> np.logical_and(arr > 1, arr < 3)
array([False,  True, False], dtype=bool)

>>> np.bitwise_and(arr > 1, arr < 3)
array([False,  True, False], dtype=bool)

>>> (arr > 1) & (arr < 3)
array([False,  True, False], dtype=bool)

und bitwise_or (| Operator):

>>> np.logical_or(arr <= 1, arr >= 3)
array([ True, False,  True], dtype=bool)

>>> np.bitwise_or(arr <= 1, arr >= 3)
array([ True, False,  True], dtype=bool)

>>> (arr <= 1) | (arr >= 3)
array([ True, False,  True], dtype=bool)

Eine vollständige Liste der logischen und binären Funktionen finden Sie in der NumPy-Dokumentation:

wenn du mit arbeitest pandas Was das Problem für mich löste, war, dass ich versuchte, Berechnungen durchzuführen, als ich NA-Werte hatte. Die Lösung bestand darin, Folgendes auszuführen:

df = df.dropna()

Und danach die Rechnung, die fehlschlug.

Benutzer-Avatar
Frage an 42 steht mit der Ukraine

Nehmen Sie die Antwort von @ ZF007 auf, Dies beantwortet Ihre Frage nicht als Ganzes, kann aber die Lösung für denselben Fehler sein. Ich poste es hier, da ich keine direkte Lösung als Antwort auf diese Fehlermeldung an anderer Stelle auf Stack Overflow gefunden habe.

Der Fehler tritt auf, wenn Sie überprüfen, ob ein Array leer war oder nicht.

  • if np.array([1,2]): print(1) –> ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all().

  • if np.array([1,2])[0]: print(1) –> kein ValueError, aber: if np.array([])[0]: print(1) –> IndexError: index 0 is out of bounds for axis 0 with size 0.

  • if np.array([1]): print(1) –> kein ValueError, hilft aber wieder nicht bei einem Array mit vielen Elementen.

  • if np.array([]): print(1) –> DeprecationWarning: The truth value of an empty array is ambiguous. Returning False, but in future this will result in an error. Use 'array.size > 0' to check that an array is not empty.

Dabei:

  • if np.array([]).size: print(1) den Fehler behoben.

  • Wenn Sie den Kommentar von @loki aufgreifen, könnten Sie auch das pythonischere in Betracht ziehen:

    if np.array([]) is not None: print(1)

  • Ein anderer möglicherweise weniger verwirrender Weg könnte sein: if np.array([]) is not None: print(1)

    – Loki

    14. Januar um 14:20 Uhr

Benutzer-Avatar
Trenton McKinney

Diese getippte Fehlermeldung zeigt auch während an if-statement Der Vergleich wird durchgeführt, wenn ein Array vorhanden ist und beispielsweise ein bool oder int. Siehe zum Beispiel:

... code snippet ...

if dataset == bool:
    ....

... code snippet ...

Diese Klausel hat einen Datensatz als Array und bool ist euhm die “offene Tür” … True oder False.

Falls die Funktion in a eingeschlossen ist try-statement Sie erhalten mit except Exception as error: die Nachricht ohne ihren Fehlertyp:

Der Wahrheitswert eines Arrays mit mehr als einem Element ist mehrdeutig. Verwenden Sie a.any() oder a.all()

  • Ein anderer möglicherweise weniger verwirrender Weg könnte sein: if np.array([]) is not None: print(1)

    – Loki

    14. Januar um 14:20 Uhr

Benutzer-Avatar
Schein Fiorin

Bei mir trat dieser Fehler beim Testen auf, Code mit Fehler unten:

pixels = []
self.pixels = numpy.arange(1, 10)
self.assertEqual(self.pixels, pixels)

Dieser Code gab zurück:

ValueError: Der Wahrheitswert eines Arrays mit mehr als einem Element ist mehrdeutig. Verwenden Sie a.any() oder a.all()

Weil ich das von der Methode Arrange von numpy zurückgegebene Objekt nicht mit einer Liste bestätigen kann.

Lösung Um das Arrange-Objekt von numpy in eine Liste umzuwandeln, habe ich mich für die Methode entschieden toList()wie folgt:

pixels = []
self.pixels = numpy.arange(1, 10).toList()
self.assertEqual(self.pixels, pixels)

1089780cookie-checkValueError: Der Wahrheitswert eines Arrays mit mehr als einem Element ist mehrdeutig. Verwenden Sie a.any() oder a.all()

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy