Angenommen , ich eine numpy Array haben x = [5, 2, 3, 1, 4, 5]
, y = ['f', 'o', 'o', 'b', 'a', 'r']
. Ich möchte die Elemente auswählen, die Elementen y
entsprechen x
, die größer als 1 und kleiner als 5 sind.
Ich habe es versucht
x = array([5, 2, 3, 1, 4, 5])
y = array(['f','o','o','b','a','r'])
output = y[x > 1 & x < 5] # desired output is ['o','o','a']
aber das funktioniert nicht. Wie würde ich das machen?
&
hat eine höhere Priorität als<
und>
, die wiederum eine höhere Priorität als (logisch) habenand
.x > 1 and x < 5
evouliert zuerst die Ungleichungen und dann die logische Konjunktion;x > 1 & x < 5
wertet die bitweise Konjunktion von1
und (die Werte in)x
und dann die Ungleichungen aus.(x > 1) & (x < 5)
zwingt die Ungleichungen dazu, zuerst zu bewerten, sodass alle Operationen in der beabsichtigten Reihenfolge ausgeführt werden und die Ergebnisse genau definiert sind. Siehe Dokumente hier.(0 < x) & (x < 10)
(wie in der Antwort gezeigt), stattdessen0 < x < 10
funktioniert dies nicht für numpy Arrays in einer Python-Version.IMO OP will eigentlich nicht
np.bitwise_and()
(aka&
), sondern eigentlich,np.logical_and()
weil sie logische Werte wieTrue
und vergleichenFalse
- siehe diesen SO-Beitrag auf logisch vs. bitweise , um den Unterschied zu sehen.Ein gleichwertiger Weg, dies zu tun, besteht darin
np.all()
, dasaxis
Argument entsprechend festzulegen.durch die Zahlen:
so mit
np.all()
langsamer, aber&
undlogical_and
sind in etwa gleich.quelle
output = y[np.logical_and(x > 1, x < 5)]
,x < 5
wird ausgewertet (möglicherweise eine enorme Array erstellen), auch wenn es das zweite Argument ist, weil die Auswertung außerhalb der Funktion geschieht. IOW,logical_and
erhält zwei bereits ausgewertete Argumente. Dies unterscheidet sich von dem üblichen Fall vona and b
, in demb
nicht bewertet wird, oba
es wahr ist.Fügen Sie den Antworten von @JF Sebastian und @Mark Mikofski ein Detail hinzu:
Wenn Sie die entsprechenden Indizes (anstelle der tatsächlichen Werte des Arrays) erhalten möchten , reicht der folgende Code aus:
Zur Erfüllung mehrerer (aller) Bedingungen:
Zur Erfüllung mehrerer (oder) Bedingungen:
quelle
(the array of indices you want,)
müssenselect_indices = np.where(...)[0]
Sie also das gewünschte Ergebnis erhalten und erwarten.Ich benutze es gerne
np.vectorize
für solche Aufgaben. Folgendes berücksichtigen:Der Vorteil ist, dass Sie der vektorisierten Funktion viele weitere Arten von Einschränkungen hinzufügen können.
Ich hoffe es hilft.
quelle
Eigentlich würde ich es so machen:
L1 ist die Indexliste der Elemente, die die Bedingung 1 erfüllen (möglicherweise können Sie L1 verwenden
somelist.index(condition1)
odernp.where(condition1)
erhalten.)In ähnlicher Weise erhalten Sie L2, eine Liste von Elementen, die Bedingung 2 erfüllen;
Dann finden Sie die Kreuzung mit
intersect(L1,L2)
.Sie können auch Schnittpunkte mehrerer Listen finden, wenn Sie mehrere Bedingungen erfüllen müssen.
Dann können Sie den Index in jedem anderen Array anwenden, z. B. x.
quelle
Bei 2D-Arrays können Sie dies tun. Erstellen Sie unter Verwendung der Bedingung eine 2D-Maske. Geben Sie die Bedingungsmaske je nach Array in int oder float ein und multiplizieren Sie sie mit dem ursprünglichen Array.
quelle