Ich habe gerade einen logischen Fehler in meinem Code entdeckt, der alle möglichen Probleme verursachte. Ich habe versehentlich ein bitweises UND anstelle eines logischen UND gemacht .
Ich habe den Code geändert von:
r = mlab.csv2rec(datafile, delimiter=',', names=COL_HEADERS)
mask = ((r["dt"] >= startdate) & (r["dt"] <= enddate))
selected = r[mask]
ZU:
r = mlab.csv2rec(datafile, delimiter=',', names=COL_HEADERS)
mask = ((r["dt"] >= startdate) and (r["dt"] <= enddate))
selected = r[mask]
Zu meiner Überraschung erhielt ich die ziemlich kryptische Fehlermeldung:
ValueError: Der Wahrheitswert eines Arrays mit mehr als einem Element ist nicht eindeutig. Verwenden Sie a.any () oder a.all ()
Warum wurde ein ähnlicher Fehler nicht ausgegeben, wenn ich eine bitweise Operation verwende - und wie behebe ich das?
Antworten:
r
ist ein numpy (rec) Array. Sor["dt"] >= startdate
ist auch ein (boolesches) Array. Bei numpy-Arrays gibt die&
Operation das elementweise und der beiden booleschen Arrays zurück.Die NumPy-Entwickler waren der Ansicht, dass es keinen allgemein bekannten Weg gibt, ein Array im booleschen Kontext zu bewerten: Es könnte bedeuten,
True
ob ein Element vorhanden istTrue
oderTrue
ob alle Elemente vorhanden sindTrue
oderTrue
ob das Array eine Länge ungleich Null hat, um nur drei zu nennen Möglichkeiten.Da unterschiedliche Benutzer möglicherweise unterschiedliche Anforderungen und Annahmen haben, weigerten sich die NumPy-Entwickler zu raten und beschlossen stattdessen, einen ValueError auszulösen, wenn versucht wird, ein Array im booleschen Kontext auszuwerten. Durch Anwenden
and
auf zwei Numpy-Arrays werden die beiden Arrays im booleschen Kontext ausgewertet (durch Aufrufen__bool__
von Python3 oder__nonzero__
Python2).Ihr Originalcode
sieht richtig aus. Wenn Sie jedoch nicht möchten
and
, dann statta and b
Verwendung(a-b).any()
oder(a-b).all()
.quelle
np.all
undnp.any
in der Lage sind, einen Kurzschluss zu verursachen, wird das an ihn übergebene Argument vorher ausgewertetnp.all
oder esnp.any
besteht die Möglichkeit eines Kurzschlusses. Um dies besser zu machen, müssten Sie derzeit einen ähnlichen speziellen C / Cython-Code schreiben .Ich hatte das gleiche Problem (dh Indizierung mit mehreren Bedingungen, hier werden Daten in einem bestimmten Datumsbereich gefunden). Die
(a-b).any()
oder(a-b).all()
scheinen nicht zu funktionieren, zumindest für mich.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 beim Versuch, ein Array zu indizieren, nicht eindeutig ).
Anstatt den oben vorgeschlagenen Code zu verwenden, würde einfach die Verwendung von a
numpy.logical_and(a,b)
funktionieren. Hier möchten Sie möglicherweise den Code umschreiben alsquelle
Der Grund für die Ausnahme ist, dass
and
implizit aufgerufen wirdbool
. Zuerst auf dem linken Operanden und (wenn der linke Operand istTrue
) dann auf dem rechten Operanden. Istx and y
also gleichbedeutend mitbool(x) and bool(y)
.Das
bool
on anumpy.ndarray
(wenn es mehr als ein Element enthält) löst jedoch die Ausnahme aus, die Sie gesehen haben:Der
bool()
Anruf ist implizit inand
, sondern auch inif
,while
,or
, so dass jede der folgenden Beispiele wird auch fehlschlagen:Es gibt mehr Funktionen und Anweisungen in Python, die
bool
Aufrufe verbergen. Dies ist beispielsweise2 < x < 10
nur eine andere Schreibweise2 < x and x < 10
. Und derand
wird anrufenbool
:bool(2 < x) and bool(x < 10)
.Das elementweise Äquivalent für
and
wäre dienp.logical_and
Funktion, ähnlich wie Sie esnp.logical_or
als Äquivalent für verwenden könntenor
.Für boolean Arrays - und Vergleiche wie
<
,<=
,==
,!=
,>=
und>
auf NumPy Arrays zurückgeben boolean NumPy Arrays - auch die können elementweise bitweise Funktionen (und Betreiber):np.bitwise_and
(&
Betreiber)und
bitwise_or
(|
Betreiber):Eine vollständige Liste der logischen und binären Funktionen finden Sie in der NumPy-Dokumentation:
quelle
Wenn Sie mit
pandas
dem arbeiten, was das Problem für mich gelöst hat, war, dass ich versucht habe, Berechnungen durchzuführen, wenn ich NA-Werte hatte, war die Lösung:df = df.dropna()
Und danach die Berechnung, die fehlgeschlagen ist.
quelle
Diese typisierte Fehlermeldung wird auch angezeigt, während ein
if-statement
Vergleich durchgeführt wird, wenn ein Array und beispielsweise ein Bool oder Int vorhanden sind. Siehe zum Beispiel:Diese Klausel hat einen Datensatz als Array und bool ist euhm die "offene Tür" ...
True
oderFalse
.Falls die Funktion in eine eingeschlossen
try-statement
ist, erhalten Sieexcept Exception as error:
die Nachricht ohne Fehlertyp:quelle
Versuchen Sie dies => numpy.array (r) oder numpy.array (Ihre Variable), gefolgt vom Befehl, um zu vergleichen, was Sie wollen.
quelle