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
numpy: Mittelwerte berechnen, wenn ein Ereignis wahr ist
@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.])
Hallo BlackJack,
danke für die schnelle und ausführliche Erklärung.
Hast mir sehr weitergeholfen:
Vielleicht kann jmd. den Code-Schnipsel verwenden:
Viele Grüße
Alois
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
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)
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.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Ubuntu 14.04 / 16.04
@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:
Wenn man jetzt noch die Fähigkeiten von NumPy ausnutzt, erhält man schließlich:
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,:])
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)
@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:
Wenn man jetzt noch die Fähigkeiten von NumPy ausnutzt, erhält man schließlich:
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,:])
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)