Seite 1 von 1

Gezielte Addition/Kombination von zwei Listen

Verfasst: Mittwoch 28. November 2018, 13:19
von Ede1994
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.

Re: Gezielte Addition/Kombination von zwei Listen

Verfasst: Mittwoch 28. November 2018, 13:33
von __blackjack__
@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.

Re: Gezielte Addition/Kombination von zwei Listen

Verfasst: Mittwoch 28. November 2018, 13:42
von Ede1994
@__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?

Re: Gezielte Addition/Kombination von zwei Listen

Verfasst: Mittwoch 28. November 2018, 14:13
von Ede1994
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?

Re: Gezielte Addition/Kombination von zwei Listen

Verfasst: Mittwoch 28. November 2018, 14:59
von Sirius3
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)]

Re: Gezielte Addition/Kombination von zwei Listen

Verfasst: Mittwoch 28. November 2018, 15:07
von Ede1994
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 :)

Re: Gezielte Addition/Kombination von zwei Listen

Verfasst: Mittwoch 28. November 2018, 15:26
von Sirius3
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.

Re: Gezielte Addition/Kombination von zwei Listen

Verfasst: Mittwoch 28. November 2018, 15:52
von Ede1994
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'

Re: Gezielte Addition/Kombination von zwei Listen

Verfasst: Mittwoch 28. November 2018, 16:42
von Sirius3
`values` und `indices` müssen numpy-Arrays sein.

Re: Gezielte Addition/Kombination von zwei Listen

Verfasst: Donnerstag 29. November 2018, 10:05
von Ede1994
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)


Re: Gezielte Addition/Kombination von zwei Listen

Verfasst: Donnerstag 29. November 2018, 11:19
von Sirius3
Den Fehler hast Du doch auch, weil es schwierig ist, den Mittelwert von null Zahlen zu bestimmen.

Re: Gezielte Addition/Kombination von zwei Listen

Verfasst: Donnerstag 29. November 2018, 12:24
von Ede1994
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.

Re: Gezielte Addition/Kombination von zwei Listen

Verfasst: Donnerstag 29. November 2018, 12:38
von __blackjack__
@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.