czy istnieje bardziej efektywny sposób obliczania średniej tablicy w określonych wcześniej pojemnikach? na przykład mam tablicę liczb i tablicę odpowiadającą pozycjom początkowym i końcowym bin w tej tablicy i chcę po prostu wziąć średnią w tych koszach? Mam kod, który to robi, ale zastanawiam się, jak można go zmniejszyć i ulepszyć. dzięki.
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()
metoda będzie szybsza dla dużej liczby pojemników. Ale musisz się profilować, nie mogę tego dla ciebie zrobić.Funkcja Scipy (> = 0.11) scipy.stats.binned_statistic odnosi się konkretnie do powyższego pytania.
W przypadku tego samego przykładu, co w poprzednich odpowiedziach, rozwiązaniem Scipy byłoby
źródło
Nie jestem pewien, dlaczego ta nić została nekroć; ale oto odpowiedź zatwierdzona w 2014 roku, która powinna być znacznie szybsza:
źródło
mean[0] = np.mean(data[0:10])
, chociaż prawidłowa odpowiedź powinna byćnp.mean(data[data < 10])
Numpy_indexed pakiet (disclaimer: Jestem jego autorem) zawiera funkcjonalności do efektywnego wykonywania operacji tego typu:
Jest to zasadniczo to samo rozwiązanie, które zamieściłem wcześniej; ale teraz zapakowany w ładny interfejs, z testami i wszystkim :)
źródło
Dodałbym, a także aby odpowiedzieć na pytanie, znajdź średnie wartości bin za pomocą histogram2d python, że scipy ma również funkcję specjalnie zaprojektowaną do obliczania dwuwymiarowej statystyki binowanej dla jednego lub więcej zestawów danych
funkcja scipy.stats.binned_statistic_dd jest uogólnieniem tej funkcji dla zbiorów danych o wyższych wymiarach
źródło
Inną alternatywą jest użycie ufunc.at. Ta metoda stosuje w miejscu żądaną operację przy określonych indeksach. Możemy uzyskać pozycję bin dla każdego punktu danych za pomocą metody wyszukiwania z sortowaniem. Następnie możemy użyć at, aby zwiększyć o 1 pozycję histogramu w indeksie podanym przez bin_indexes, za każdym razem, gdy napotkamy indeks w bin_indexes.
źródło