numpy: Mittelwerte berechnen, wenn ein Ereignis wahr ist

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Alois
User
Beiträge: 12
Registriert: Dienstag 13. Dezember 2016, 14:45

numpy: Mittelwerte berechnen, wenn ein Ereignis wahr ist

Beitragvon Alois » Samstag 11. Februar 2017, 21:44

Hallo Community,
habe ein zweidimensionales (Reihen und Spalten) numpy.array (--> A) vorliegen.
Nun möchte ich die Mittelwerte der Spalte 2 bilden, wenn der Wert in der Spalte 3 der entsprechenden Zeile z.B. 10 ist:

"bilde Mittelwerte von A[:,2], wenn A[:,3] == 10"

Wie kann man dies in Python (numpy) abbilden?

Danke für Tipps
Alois
Ubuntu 14.04 / 16.04
BlackJack

Re: numpy: Mittelwerte berechnen, wenn ein Ereignis wahr ist

Beitragvon BlackJack » Samstag 11. Februar 2017, 21:52

@Alois: Ganz einfach das Ergebnis vom Vergleich als Index in das Array mit den Werten der anderen Spalte verwenden.
  1. In [9]: A
  2. Out[9]:
  3. array([[  1.,  10.],
  4.        [  2.,  23.],
  5.        [  3.,  10.],
  6.        [  4.,  42.]])
  7.  
  8. In [10]: A[:, 1]
  9. Out[10]: array([ 10.,  23.,  10.,  42.])
  10.  
  11. In [11]: A[:, 1] == 10
  12. Out[11]: array([ True, False,  True, False], dtype=bool)
  13.  
  14. In [12]: A[:, 0][A[:, 1] == 10]
  15. Out[12]: array([ 1.,  3.])
Alois
User
Beiträge: 12
Registriert: Dienstag 13. Dezember 2016, 14:45

Re: numpy: Mittelwerte berechnen, wenn ein Ereignis wahr ist

Beitragvon Alois » Sonntag 12. Februar 2017, 00:05

Hallo BlackJack,

danke für die schnelle und ausführliche Erklärung.
Hast mir sehr weitergeholfen:

  1. C[row,1+nSpalte] = np.mean((A[:,9+nSpalte][A[:,4]==row+1]))*(tmax-tmin)/3600/1000


Vielleicht kann jmd. den Code-Schnipsel verwenden:
  1. f =open(Arbeitsverzeichnis +Speichername2+"_"+str(Jahr)+"_"+str(dt)+".csv", "w")
  2. writer = csv.writer(f)
  3. row = 0
  4. C = np.zeros((Monate_max,8))
  5. while row <= Monate_max-1:    
  6.     nSpalte = 0
  7.     C[row,0] = row+1
  8.     while nSpalte <=4    :
  9.         tmin = np.min((A[:,0][A[:,4]==row+1]))
  10.         tmax = np.max((A[:,0][A[:,4]==row+1]))
  11.         C[row,1+nSpalte] = np.mean((A[:,9+nSpalte][A[:,4]==row+1]))*(tmax-tmin)/3600/1000
  12.         nSpalte +=1
  13.     C[row,6] = C[row,3]/C[row,2]
  14.     C[row,7] = C[row,3]/C[row,1]
  15.     writer.writerow(C [row,:])  
  16.     row +=1      
  17. f.close()
  18. np.save (Arbeitsverzeichnis +Speichername2+"_"+str(Jahr)+"_"+str(dt), C)


Viele Grüße
Alois
Zuletzt geändert von Anonymous am Sonntag 12. Februar 2017, 01:12, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Ubuntu 14.04 / 16.04
Sirius3
User
Beiträge: 6542
Registriert: Sonntag 21. Oktober 2012, 17:20

Re: numpy: Mittelwerte berechnen, wenn ein Ereignis wahr ist

Beitragvon Sirius3 » Sonntag 12. Februar 2017, 10:21

@Alois: Pfade stückelt man nicht mit + zusammen, sondern nimmt os.path.join. Statt einer while-Schleife wäre hier eine for-Schleife angebrachter. Statt maske, tmin und tmax für jede Spalte neu zu berechnen, würde das auch einmal reichten.

Also Zwischenstand kommen wir dann zu:
  1. filename = os.path.join(Arbeitsverzeichnis, "{}_{}_{}.csv".format(Speichername2, Jahr, dt))
  2. with open(filename, "w") as f:
  3.     writer = csv.writer(f)
  4.     C = np.zeros((Monate_max,8))
  5.     for row in range(Monate_max):
  6.         C[row,0] = row+1
  7.         mask = A[:,4]==row+1
  8.         tmin = A[mask,0].min()
  9.         tmax = A[mask,0].max()
  10.         faktor = (tmax-tmin)/3600/1000
  11.         for nSpalte in range(1, 6):
  12.             C[row, nSpalte] = A[mask,8+nSpalte].mean() * faktor
  13.         C[row,6] = C[row,3]/C[row,2]
  14.         C[row,7] = C[row,3]/C[row,1]
  15.         writer.writerow(C[row,:])  


Wenn man jetzt noch die Fähigkeiten von NumPy ausnutzt, erhält man schließlich:
  1. C = np.zeros((Monate_max, 8))
  2. C[:, 0] = range(Monate_max)
  3. for row in C:
  4.     mask = A[:, 4]==row[0]
  5.     faktor = A[mask, 0].ptp() / 3600 / 1000
  6.     row[1:6] = A[mask, 9:14].mean(axis=0) * faktor
  7. C[:, 6] = C[:, 3] / C[:, 2]
  8. C[:, 7] = C[:, 3] / C[:, 1]
  9. filename = os.path.join(Arbeitsverzeichnis, "{}_{}_{}.csv".format(Speichername2, Jahr, dt))
  10. np.save(filename, C)
Sirius3
User
Beiträge: 6542
Registriert: Sonntag 21. Oktober 2012, 17:20

Re: numpy: Mittelwerte berechnen, wenn ein Ereignis wahr ist

Beitragvon Sirius3 » Sonntag 12. Februar 2017, 10:21

@Alois: Pfade stückelt man nicht mit + zusammen, sondern nimmt os.path.join. Statt einer while-Schleife wäre hier eine for-Schleife angebrachter. Statt maske, tmin und tmax für jede Spalte neu zu berechnen, würde das auch einmal reichten.

Also Zwischenstand kommen wir dann zu:
  1. filename = os.path.join(Arbeitsverzeichnis, "{}_{}_{}.csv".format(Speichername2, Jahr, dt))
  2. with open(filename, "w") as f:
  3.     writer = csv.writer(f)
  4.     C = np.zeros((Monate_max,8))
  5.     for row in range(Monate_max):
  6.         C[row,0] = row+1
  7.         mask = A[:,4]==row+1
  8.         tmin = A[mask,0].min()
  9.         tmax = A[mask,0].max()
  10.         faktor = (tmax-tmin)/3600/1000
  11.         for nSpalte in range(1, 6):
  12.             C[row, nSpalte] = A[mask,8+nSpalte].mean() * faktor
  13.         C[row,6] = C[row,3]/C[row,2]
  14.         C[row,7] = C[row,3]/C[row,1]
  15.         writer.writerow(C[row,:])  


Wenn man jetzt noch die Fähigkeiten von NumPy ausnutzt, erhält man schließlich:
  1. C = np.zeros((Monate_max, 8))
  2. C[:, 0] = range(Monate_max)
  3. for row in C:
  4.     mask = A[:, 4]==row[0]
  5.     faktor = A[mask, 0].ptp() / 3600 / 1000
  6.     row[1:6] = A[mask, 9:14].mean(axis=0) * faktor
  7. C[:, 6] = C[:, 3] / C[:, 2]
  8. C[:, 7] = C[:, 3] / C[:, 1]
  9. filename = os.path.join(Arbeitsverzeichnis, "{}_{}_{}.csv".format(Speichername2, Jahr, dt))
  10. np.save(filename, C)
Alois
User
Beiträge: 12
Registriert: Dienstag 13. Dezember 2016, 14:45

Re: numpy: Mittelwerte berechnen, wenn ein Ereignis wahr ist

Beitragvon Alois » Sonntag 12. Februar 2017, 13:05

Hallo Sirius,

vielen Dank für die Tipps.
Werde ich umsetzen.

Viele Grüße
Alois
Ubuntu 14.04 / 16.04

Wer ist online?

Mitglieder in diesem Forum: exidio