Was bedeutet x[x < 2] = 0 bedeutet in Python?
Stieß ich auf einige code mit einer Zeile, die ähnlich
x[x<2]=0
Rund um das Spiel mit Variationen, ich bin immer noch nicht auf was diese syntax bedeutet.
Beispiele:
>>> x = [1,2,3,4,5]
>>> x[x<2]
1
>>> x[x<3]
1
>>> x[x>2]
2
>>> x[x<2]=0
>>> x
[0, 2, 3, 4, 5]
InformationsquelleAutor der Frage aberger | 2016-04-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Macht dies nur Sinn mit NumPy arrays. Das Verhalten mit Listen ist sinnlos, und speziell auf Python 2 (nicht Python 3). Sie kann überprüfen wollen, wenn das ursprüngliche Objekt war in der Tat ein NumPy-array (siehe weiter unten) und nicht eine Liste.
Aber in deinem code hier, x ist eine einfache Liste.
Seit
Falsch ist
ich.e 0, daher
x[x<2]
istx[0]
x[0]
verändert wird.Umgekehrt
x[x>2]
istx[True]
oderx[1]
So,
x[1]
verändert wird.Warum geschieht dies?
Die Regeln für den Vergleich sind:
Wenn Sie, um zwei Zeichenfolgen oder zwei numerischen Typen die Bestellung erfolgt in der erwarteten Weise (lexikographische Reihenfolge für die string -, numerischen Bestellung für ganze zahlen).
Wenn Sie die Reihenfolge ein numerischer und nicht-numerischer Datentyp, der numerische Typ kommt zuerst.
Wenn Sie um zwei inkompatible Typen wo keiner ist numerisch, Sie sind sortiert nach der alphabetischen Reihenfolge Ihrer typenames:
So haben wir die folgende Reihenfolge
numerisch < Liste < string < Tupel
Sehen die akzeptierte Antwort für Wie funktioniert Python zu vergleichen, string und int?.
Wenn x ist ein NumPy-arraydann ist die syntax macht mehr Sinn, weil boolean array-Indizierung. In diesem Fall
x < 2
ist nicht ein boolean; es ist ein array von booleans der Vertretung, ob jedes element vonx
war weniger als 2.x[x < 2] = 0
dann wählt die Elemente derx
waren weniger als 2 und setzt diese Zellen auf 0. Sehen Indizierung.InformationsquelleAutor der Antwort trans1st0r
Bool ist einfach in eine Ganzzahl konvertiert. Der index ist entweder 0 oder 1.
InformationsquelleAutor der Antwort Karoly Horvath
Den original-code in Ihre Frage funktioniert nur in Python 2. Wenn
x
ist einlist
in Python 2, der Vergleichx < y
istFalse
wenny
ist einint
eger. Dies ist, weil es keinen Sinn macht zu vergleichen, eine Liste mit einem integer. Allerdings in Python 2, wenn die Operanden nicht vergleichbar, der Vergleich ist in CPython auf die alphabetischer Reihenfolge der Namen der Typen; zusätzlich alle zahlen zunächst in gemischten Typ Vergleiche. Dies ist noch nicht einmal ausgeschrieben und in der Dokumentation von CPython 2, und unterschiedliche Python-2-Implementierungen geben könnte unterschiedliche Ergebnisse. Das ist[1, 2, 3, 4, 5] < 2
ausgewertetFalse
weil2
ist eine Zahl und damit "kleiner" als einlist
in CPython. Diese gemischt-Vergleich wurde schließlich als zu unverständlich ein featureund entfernt wurde, in Python 3.0.Nun, das Ergebnis
<
ist einbool
; undbool
ist eine Unterklasseint
:Also im Grunde nehmen Sie das element 0 oder 1, je nachdem, ob der Vergleich wahr oder falsch ist.
Wenn Sie versuchen, den obigen code in Python 3, erhalten Sie
TypeError: unorderable types: list() < int()
aufgrund eine änderung in Python 3.0:Gibt es viele Datentypen, die überlastung die Vergleichsoperatoren, um etwas zu tun verschiedenen (dataframes von pandas, numpy - arrays). Wenn der code, den Sie Tat etwas anderes, es war, weil
x
war nichtlist
aber eine Instanz von einer anderen Klasse mit operator<
überschrieben, um einen Wert zurück, der ist nicht einbool
; und dieser Wert wurde dann speziell behandelt, indemx[]
(aka__getitem__
/__setitem__
)InformationsquelleAutor der Antwort Antti Haapala
Dieser hat eine weitere Verwendung: code golf. Code golf ist die Kunst, Programme zu schreiben, die lösen ein problem, in so wenigen source-code-bytes wie möglich.
entspricht ungefähr
außer, dass beide a und b werden ausgewertet, in der ersten version, aber nicht in der zweiten version.
c<d
ausgewertetTrue
oderFalse
.(a, b)
ist ein Tupel.Die Indizierung auf ein Tupel funktioniert wie die Indizierung auf die Liste:
(3,5)[1]
==5
.True
gleich1
undFalse
gleich0
.(a,b)[c<d]
(a,b)[True]
(a,b)[1]
b
oder für
False
:(a,b)[c<d]
(a,b)[False]
(a,b)[0]
a
Gibt es eine gute Liste auf den stack-exchange-Netzwerk der vielen bösen Dinge, die Sie tun können, um python zu speichern, um ein paar bytes. https://codegolf.stackexchange.com/questions/54/tips-for-golfing-in-python
Obwohl in normalen code dies sollte nie verwendet werden, und in Ihrem Fall würde es bedeuten, dass
x
fungiert sowohl als etwas, das sich im Vergleich zu einer ganzen Zahl und als container unterstützt geschnitten, was eine sehr ungewöhnliche Kombination. Es ist wahrscheinlich Numpy-code, wie andere haben darauf hingewiesen.InformationsquelleAutor der Antwort Filip Haglund
Im Allgemeinen, könnte es bedeuten, alles. Es wurde bereits erklärt, was es bedeutet, wenn
x
ist einlist
odernumpy.ndarray
aber im Allgemeinen kommt es nur noch darauf an, wie die Vergleichsoperatoren (<
>
...) und auch, wie Sie die get - /set-item ([...]
-syntax) umgesetzt werden.Weil:
x < value
entsprichtx.__lt__(value)
x[value]
ist (in etwa) äquivalent zux.__getitem__(value)
x[value] = othervalue
ist (auch in etwa) äquivalent zux.__setitem__(value, othervalue)
.Diese können angepasst werden, um zu tun alles Sie wollen. Nur als Beispiel (imitiert ein bisschen numpys-Boolesche Indexierung):
So, jetzt lasst uns sehen, was passiert, wenn Sie es verwenden:
Achtung: dies ist nur eine Möglichkeit. Sie sind frei, zu implementieren fast alles, was Sie wollen.
InformationsquelleAutor der Antwort MSeifert