Gibt es eine effizientere Möglichkeit, einen Durchschnitt eines Arrays in vorgegebenen Behältern zu ermitteln? Zum Beispiel habe ich ein Array von Zahlen und ein Array, das den Start- und Endpositionen der Bins in diesem Array entspricht, und ich möchte nur den Mittelwert in diesen Bins nehmen. Ich habe Code, der es unten tut, aber ich frage mich, wie es reduziert und verbessert werden kann. Vielen Dank.
from scipy import *
from numpy import *
def get_bin_mean(a, b_start, b_end):
ind_upper = nonzero(a >= b_start)[0]
a_upper = a[ind_upper]
a_range = a_upper[nonzero(a_upper < b_end)[0]]
mean_val = mean(a_range)
return mean_val
data = rand(100)
bins = linspace(0, 1, 10)
binned_data = []
n = 0
for n in range(0, len(bins)-1):
b_start = bins[n]
b_end = bins[n+1]
binned_data.append(get_bin_mean(data, b_start, b_end))
print binned_data
histogram()
Methode für eine große Anzahl von Behältern schneller ist. Aber du musst dich profilieren, das kann ich nicht für dich tun.Die Scipy (> = 0.11) -Funktion scipy.stats.binned_statistic speziell mit der obigen Frage.
Für das gleiche Beispiel wie in den vorherigen Antworten wäre die Scipy-Lösung
quelle
Ich bin mir nicht sicher, warum dieser Thread nekrotisch wurde. Aber hier ist eine 2014 genehmigte Antwort, die viel schneller sein sollte:
quelle
mean[0] = np.mean(data[0:10])
, während die richtige Antwort sein solltenp.mean(data[data < 10])
Das Paket numpy_indexed (Haftungsausschluss: Ich bin sein Autor) enthält Funktionen zur effizienten Ausführung von Operationen dieses Typs:
Dies ist im Wesentlichen die gleiche Lösung wie die, die ich zuvor veröffentlicht habe. aber jetzt in eine schöne Oberfläche gewickelt, mit Tests und allem :)
quelle
Ich würde hinzufügen und auch die Frage beantworten , mittlere Bin-Werte mit histogram2d Python zu finden, dass der Scipy auch eine Funktion hat, die speziell entwickelt wurde, um eine zweidimensionale Binned-Statistik für einen oder mehrere Datensätze zu berechnen
Die Funktion scipy.stats.binned_statistic_dd ist eine Verallgemeinerung dieser Funktion für Datensätze mit höheren Dimensionen
quelle
Eine andere Alternative ist die Verwendung von ufunc.at. Diese Methode wendet an Ort und Stelle eine gewünschte Operation an bestimmten Indizes an. Wir können die Bin-Position für jeden Datenpunkt mithilfe der suchsortierten Methode ermitteln. Dann können wir at verwenden, um die Position des Histogramms am Index von bin_indexes jedes Mal um 1 zu erhöhen, wenn wir auf einen Index bei bin_indexes stoßen.
quelle