Gezielte Addition/Kombination von zwei Listen

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
Benutzeravatar
Ede1994
User
Beiträge: 72
Registriert: Dienstag 2. Mai 2017, 12:41

Folgendes Problem:
Ich habe zwei Listen mit gleicher Anzahl an Einträgen und möchte nun aus den Informationen meiner Liste1 (besteht aus den int-Zahlen 0,1,2,3,5), die Liste2 (random float-Zahlen) gezielt addieren. Die Addition soll im Prinzip so erfolgen, dass alle zur z.B. 0 gehörigen Werte addiert werden. BSP.:

Code: Alles auswählen

[0,1,1,0,2,2,5,.......,5,1,0]
[x1,x2,x3,x4,x5,x6,x7,.......,x(N-2),x(N-1),xN]
0 => x1+x4+....+xN
1 => x2+x3+....+x(N-1)
2 => x5+x6
5 => x7+....+x(N-2)
Am Ende hätte ich gerne ein array der Form: (also 1.Spalte die Zahlen 0,1,2,3,5 und in der 2. Spalte die Summen aus der Liste2)

Code: Alles auswählen

0 Ergebnis
1 Ergebnis
2 Ergebnis
3 Ergebnis
5 Ergebnis
Danach möchte ich das dann plotten.
Benutzeravatar
__blackjack__
User
Beiträge: 13061
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Ede1994: `collections.defaultdict`, die `zip()`-Funktion, und eine ``for``-Schleife sind eigentlich alles was man da braucht. Eventuell noch `sorted()` wenn das Ergebnis nach den Schlüsseln sortiert werden soll.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
Ede1994
User
Beiträge: 72
Registriert: Dienstag 2. Mai 2017, 12:41

@__blackjack__:
`collections.defaultdict`, die `zip()`-Funktion, und eine ``for``-Schleife sind eigentlich alles was man da braucht. Eventuell noch `sorted()` wenn das Ergebnis nach den Schlüsseln sortiert werden soll.
Okay. Das ist für den Anfang zu viel :lol:
Ich wollte es über ein array probieren:

Code: Alles auswählen

kombi = np.zeros((len(data_events5),2))
liste = []
for i in range(len(data_events5)):
  liste = [data_events5[i],LIDS1(liste_counts3)[i]]
  kombi[i] = liste
So habe ich schon mal die passenden Paare zusammen. Oder wäre das zu umständlich?
Benutzeravatar
Ede1994
User
Beiträge: 72
Registriert: Dienstag 2. Mai 2017, 12:41

Ich habe jetzt eine sehr umständliche Lösung:

Code: Alles auswählen

sum0=0
anz0=0
sum1=0
anz1=0
sum2=0
anz2=0
sum3=0
anz3=0
sum5=0
anz5=0
for i in range(len(kombi)):
  if kombi[i][0] == 0.0:
    sum0 += kombi[i][1]
    anz0 += 1
  if kombi[i][0] == 1.0:
    sum1 += kombi[i][1]
    anz1 += 1
  if kombi[i][0] == 2.0:
    sum2 += kombi[i][1]
    anz2 += 1
  if kombi[i][0] == 3.0:
    sum3 += kombi[i][1]
    anz3 += 1
  if kombi[i][0] == 5.0:
    sum5 += kombi[i][1]
    anz5 += 1

sum00 = sum0/anz0
sum01 = sum1/anz1
sum02 = sum2/anz2
sum03 = sum3/anz3
sum05 = sum5/anz5

ende1 = [0,1,2,3,5]
ende2 = [sum00,sum01,sum02,sum03,sum05]
Wie kann ich das jetzt kürzen?
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

Wenn Du für die Nummern 0 bis 5 die Mittelwerte haben willst, geht das über

Code: Alles auswählen

means = [values[indices==n].mean() for n in range(6)]
Benutzeravatar
Ede1994
User
Beiträge: 72
Registriert: Dienstag 2. Mai 2017, 12:41

Sirius3 hat geschrieben: Mittwoch 28. November 2018, 14:59 Wenn Du für die Nummern 0 bis 5 die Mittelwerte haben willst, geht das über

Code: Alles auswählen

means = [values[indices==n].mean() for n in range(6)]
Okay? Danke. Aber mir hilft das gerade nicht, weil ich die Zeile nicht wirklich verstehe (bin Anfänger in Python). Könntest du das näher erläutern? Bitte :)
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

Bilde den Mittelwert über alle Werte in `values`, die an der selben Stelle in `indices` den Wert n haben für alle n von 0 bis 5.
Benutzeravatar
Ede1994
User
Beiträge: 72
Registriert: Dienstag 2. Mai 2017, 12:41

Sirius3 hat geschrieben: Mittwoch 28. November 2018, 15:26 Bilde den Mittelwert über alle Werte in `values`, die an der selben Stelle in `indices` den Wert n haben für alle n von 0 bis 5.
AHHH! Okay. Das habe ich verstanden.
Jetzt kommt nur die Fehlermeldung:

Code: Alles auswählen

AttributeError: 'float' object has no attribute 'mean'
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

`values` und `indices` müssen numpy-Arrays sein.
Benutzeravatar
Ede1994
User
Beiträge: 72
Registriert: Dienstag 2. Mai 2017, 12:41

Sirius3 hat geschrieben: Mittwoch 28. November 2018, 16:42 `values` und `indices` müssen numpy-Arrays sein.
Hab ich jetzt gemacht:

Code: Alles auswählen

data_events5_arr = np.asarray(data_events5)
LIDS1_arr = np.asarray(LIDS1(liste_counts3))

means = [LIDS1_arr[data_events5_arr==n].mean() for n in range(6)]
Erhalte jetzt aber den Fehlercode:

Code: Alles auswählen

test1.py:83: RuntimeWarning: Mean of empty slice.
  means = [LIDS1_arr[data_events5_arr==n].mean() for n in range(6)]
/usr/lib/python2.7/dist-packages/numpy/core/_methods.py:80: RuntimeWarning: invalid value encountered in double_scalars
  ret = ret.dtype.type(ret / rcount)

Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

Den Fehler hast Du doch auch, weil es schwierig ist, den Mittelwert von null Zahlen zu bestimmen.
Benutzeravatar
Ede1994
User
Beiträge: 72
Registriert: Dienstag 2. Mai 2017, 12:41

Sirius3 hat geschrieben: Donnerstag 29. November 2018, 11:19 Den Fehler hast Du doch auch, weil es schwierig ist, den Mittelwert von null Zahlen zu bestimmen.
Verstehe ich nicht!
Wieso denn null Zahlen? Ich habe beide Arrays mit Zahlen gefüllt, habe ich auch überprüft.
Benutzeravatar
__blackjack__
User
Beiträge: 13061
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Ede1994: `data_events5_arr` enthält zwar Zahlen aber eben nicht *alle* Werte zwischen 0 und 5. Mindestens ein Wert kommt offensichtlich nicht vor. Und da bekommst Du dann ein leeres Array und versuchst davon den Mittelwert zu berechnen. Wobei das ja ”funktioniert”, trotz der *Warnung* kommt da NaN bei heraus.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten