Bedingter Vergleich von numpy arrays

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
st_baum
User
Beiträge: 26
Registriert: Sonntag 24. Mai 2020, 13:54

Ich möchte zählen, wie oft werte in zwei np arrays übereinstimmen kombiniert mit einer Bedingung.

Code: Alles auswählen

ar1 = np.array([1,0,0,1,0,1])
ar2 = np.array([0,1,0,0,0,1])
np.sum(ar1 == ar2)
Hier wird gezählt, wie oft die Werte übereinstimmen. Ich möchte aber, dass unter einer Bedingung gezählt wird. Z.b. das nur gezählt wird, wenn beide arrays den Wert "0" haben, d.h. der Output sollte "2" sein. Ich habe es mit einer Bedingung versucht, das klappt aber nicht und erscheint mir auch etwas klobig.
Benutzeravatar
Dennis89
User
Beiträge: 1226
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,

zeig uns doch mal mit welcher Bedingung du das versucht hast. Dann wäre der Lerneffekt größer wie wenn du hier ein fertiges Skript bekommst. (Oder willst du genau das?)

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
st_baum
User
Beiträge: 26
Registriert: Sonntag 24. Mai 2020, 13:54

Etwas wie:

Code: Alles auswählen

if ar1 == 1 :
    np.sum(ar1 == ar2)
Funktioniert nicht. Ich vermute, weil nicht durch alle Elemente von ar1 geloopt wird. Hab den Ansatz nicht weiterverfolgt. Bin davon ausgegangen, dass es eine elegantere Lösung gibt.
Benutzeravatar
ThomasL
User
Beiträge: 1368
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Der Vergleich ar1 == ar2 liefert dir ein Array mit Boolean Werten zurück.

Code: Alles auswählen

array([False, False,  True, False,  True,  True])
Der Vergleich ar1 == 0 liefert dir auch ein Array mit Boolean Werten zurück

Code: Alles auswählen

array([False,  True,  True, False,  True, False])
Dieses zweite Array kannst du zur Indizierung des ersten benutzen.

Code: Alles auswählen

(ar1 == ar2)[ar1 == 0]
>>> array([False,  True,  True])
und kannst dann mit sum() alle True Werte addieren.

Code: Alles auswählen

sum((ar1 == ar2)[ar1 == 0])
Zuletzt geändert von ThomasL am Donnerstag 31. Dezember 2020, 13:47, insgesamt 1-mal geändert.
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Benutzeravatar
Dennis89
User
Beiträge: 1226
Registriert: Freitag 11. Dezember 2020, 15:13

Deine Bedingung fragt ab ob 'ar1' der Wert '1' hat. Du willst aber wissen ob sich dieser Wert in dem Array 'ar1' befindet und nicht ob das Objekt 'ar1' gleich dem Wert '1' ist.

Code: Alles auswählen

if 1 in ar1:
Wenn sich jetzt eine eins indem Array befindet wird dass ausgeführt was du danach in den Namensraum der If-Abfrage schreibst.

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Sirius3
User
Beiträge: 17844
Registriert: Sonntag 21. Oktober 2012, 17:20

Du willst ja zwei Bedingungen miteinander verknüpfen, dass sowohl in ar1 als auch in ar2 eine 0 steht:

Code: Alles auswählen

((ar1 == 0) & (ar2 == 0)).sum()
st_baum
User
Beiträge: 26
Registriert: Sonntag 24. Mai 2020, 13:54

Sirius3 hat geschrieben: Donnerstag 31. Dezember 2020, 13:59 Du willst ja zwei Bedingungen miteinander verknüpfen, dass sowohl in ar1 als auch in ar2 eine 0 steht:

Code: Alles auswählen

((ar1 == 0) & (ar2 == 0)).sum()
[/quote]

Das passt, danke :-)
Antworten