Seite 1 von 1

numpy: Mittelwerte berechnen, wenn ein Ereignis wahr ist

Verfasst: Samstag 11. Februar 2017, 21:44
von Alois
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

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

Verfasst: Samstag 11. Februar 2017, 21:52
von BlackJack
@Alois: Ganz einfach das Ergebnis vom Vergleich als Index in das Array mit den Werten der anderen Spalte verwenden.

Code: Alles auswählen

In [9]: A
Out[9]: 
array([[  1.,  10.],
       [  2.,  23.],
       [  3.,  10.],
       [  4.,  42.]])

In [10]: A[:, 1]
Out[10]: array([ 10.,  23.,  10.,  42.])

In [11]: A[:, 1] == 10
Out[11]: array([ True, False,  True, False], dtype=bool)

In [12]: A[:, 0][A[:, 1] == 10]
Out[12]: array([ 1.,  3.])

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

Verfasst: Sonntag 12. Februar 2017, 00:05
von Alois
Hallo BlackJack,

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

Code: Alles auswählen

C[row,1+nSpalte] = np.mean((A[:,9+nSpalte][A[:,4]==row+1]))*(tmax-tmin)/3600/1000
Vielleicht kann jmd. den Code-Schnipsel verwenden:

Code: Alles auswählen

f =open(Arbeitsverzeichnis +Speichername2+"_"+str(Jahr)+"_"+str(dt)+".csv", "w")
writer = csv.writer(f)
row = 0
C = np.zeros((Monate_max,8))
while row <= Monate_max-1:    
    nSpalte = 0
    C[row,0] = row+1
    while nSpalte <=4    :
        tmin = np.min((A[:,0][A[:,4]==row+1]))
        tmax = np.max((A[:,0][A[:,4]==row+1]))
        C[row,1+nSpalte] = np.mean((A[:,9+nSpalte][A[:,4]==row+1]))*(tmax-tmin)/3600/1000
        nSpalte +=1
    C[row,6] = C[row,3]/C[row,2]
    C[row,7] = C[row,3]/C[row,1]
    writer.writerow(C [row,:])  
    row +=1       
f.close()
np.save (Arbeitsverzeichnis +Speichername2+"_"+str(Jahr)+"_"+str(dt), C)
Viele Grüße
Alois

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

Verfasst: Sonntag 12. Februar 2017, 10:21
von Sirius3
@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:

Code: Alles auswählen

filename = os.path.join(Arbeitsverzeichnis, "{}_{}_{}.csv".format(Speichername2, Jahr, dt))
with open(filename, "w") as f:
    writer = csv.writer(f)
    C = np.zeros((Monate_max,8))
    for row in range(Monate_max):
        C[row,0] = row+1
        mask = A[:,4]==row+1
        tmin = A[mask,0].min()
        tmax = A[mask,0].max()
        faktor = (tmax-tmin)/3600/1000
        for nSpalte in range(1, 6):
            C[row, nSpalte] = A[mask,8+nSpalte].mean() * faktor
        C[row,6] = C[row,3]/C[row,2]
        C[row,7] = C[row,3]/C[row,1]
        writer.writerow(C[row,:])  
Wenn man jetzt noch die Fähigkeiten von NumPy ausnutzt, erhält man schließlich:

Code: Alles auswählen

C = np.zeros((Monate_max, 8))
C[:, 0] = range(Monate_max)
for row in C:
    mask = A[:, 4]==row[0]
    faktor = A[mask, 0].ptp() / 3600 / 1000
    row[1:6] = A[mask, 9:14].mean(axis=0) * faktor
C[:, 6] = C[:, 3] / C[:, 2]
C[:, 7] = C[:, 3] / C[:, 1]
filename = os.path.join(Arbeitsverzeichnis, "{}_{}_{}.csv".format(Speichername2, Jahr, dt))
np.save(filename, C)

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

Verfasst: Sonntag 12. Februar 2017, 10:21
von Sirius3
@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:

Code: Alles auswählen

filename = os.path.join(Arbeitsverzeichnis, "{}_{}_{}.csv".format(Speichername2, Jahr, dt))
with open(filename, "w") as f:
    writer = csv.writer(f)
    C = np.zeros((Monate_max,8))
    for row in range(Monate_max):
        C[row,0] = row+1
        mask = A[:,4]==row+1
        tmin = A[mask,0].min()
        tmax = A[mask,0].max()
        faktor = (tmax-tmin)/3600/1000
        for nSpalte in range(1, 6):
            C[row, nSpalte] = A[mask,8+nSpalte].mean() * faktor
        C[row,6] = C[row,3]/C[row,2]
        C[row,7] = C[row,3]/C[row,1]
        writer.writerow(C[row,:])  
Wenn man jetzt noch die Fähigkeiten von NumPy ausnutzt, erhält man schließlich:

Code: Alles auswählen

C = np.zeros((Monate_max, 8))
C[:, 0] = range(Monate_max)
for row in C:
    mask = A[:, 4]==row[0]
    faktor = A[mask, 0].ptp() / 3600 / 1000
    row[1:6] = A[mask, 9:14].mean(axis=0) * faktor
C[:, 6] = C[:, 3] / C[:, 2]
C[:, 7] = C[:, 3] / C[:, 1]
filename = os.path.join(Arbeitsverzeichnis, "{}_{}_{}.csv".format(Speichername2, Jahr, dt))
np.save(filename, C)

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

Verfasst: Sonntag 12. Februar 2017, 13:05
von Alois
Hallo Sirius,

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

Viele Grüße
Alois