2016-01-05 9 views
5

Mam zestaw danych (X, Y). Moje niezależne wartości zmiennych X nie są unikalne, więc istnieje wiele powtarzających się wartości, chcę wypisać nową tablicę zawierającą: X_unique, która jest listą unikatowych wartości X. Y_mean, średnia wszystkich wartości Y odpowiadających X_unique . Y_std, standardowe odchylenie wszystkich wartości Y odpowiadających X_unique.Wykonywanie średniej grupowej i odchylenia standardowego z tablicami NumPy

x = data[:,0] 
y = data[:,1] 
+1

można dodać [Minimal, kompletne i weryfikowalne przykład] (http://stackoverflow.com/help/mcve) na twoje pytanie? – Kasramvd

+0

Spójrz na http://stackoverflow.com/questions/4373631/sum-array-by-number-in-numpy –

+1

Poza tym: jeśli pracujesz z rzeczywistymi danymi, prawdopodobnie łatwiej będzie Ci znaleźć używaj ['pandas'] (http://pandas.pydata.org) niż gołego numpy. Jeśli twoje 'dane' były' DataFrame' zamiast 'ndarray', coś takiego jak' df.groupby (0) [1] .agg (["mean", "std"]) 'działałoby. – DSM

Odpowiedz

2
x_unique = np.unique(x) 
y_means = np.array([np.mean(y[x==u]) for u in x_unique]) 
y_stds = np.array([np.std(y[x==u]) for u in x_unique]) 
4

Można użyć binned_statistic from scipy.stats który obsługuje rozmaite funkcje statystycznych, które należy zastosować w kawałki całej 1D tablicy. Aby zdobyć porcje, musimy posortować i uzyskać pozycje zmian (w których zmieniają się porcje), dla których użyteczne byłoby np.unique. Umieszczenie tych wszystkich, oto implementacja -

from scipy.stats import binned_statistic as bstat 

# Sort data corresponding to argsort of first column 
sdata = data[data[:,0].argsort()] 

# Unique col-1 elements and positions of breaks (elements are not identical) 
unq_x,breaks = np.unique(sdata[:,0],return_index=True) 
breaks = np.append(breaks,data.shape[0]) 

# Use binned statistic to get grouped average and std deviation values 
idx_range = np.arange(data.shape[0]) 
avg_y,_,_ = bstat(x=idx_range, values=sdata[:,1], statistic='mean', bins=breaks) 
std_y,_,_ = bstat(x=idx_range, values=sdata[:,1], statistic='std', bins=breaks) 

Od docs binned_statistic, można również użyć funkcji niestandardowej Statystyki:

funkcję: funkcję zdefiniowaną przez użytkownika, która pobiera tablicę 1D wartości , i wyświetla pojedynczą statystykę numeryczną. Ta funkcja będzie nazywać się na wartości w każdym pojemniku. Puste pojemniki będą reprezentowane przez funkcję ([]) lub NaN, jeśli zwróci błąd.

wejście próbki, wyjście -

In [121]: data 
Out[121]: 
array([[2, 5], 
     [2, 2], 
     [1, 5], 
     [3, 8], 
     [0, 8], 
     [6, 7], 
     [8, 1], 
     [2, 5], 
     [6, 8], 
     [1, 8]]) 

In [122]: np.column_stack((unq_x,avg_y,std_y)) 
Out[122]: 
array([[ 0.  , 8.  , 0.  ], 
     [ 1.  , 6.5  , 1.5  ], 
     [ 2.  , 4.  , 1.41421356], 
     [ 3.  , 8.  , 0.  ], 
     [ 6.  , 7.5  , 0.5  ], 
     [ 8.  , 1.  , 0.  ]]) 
+0

Didn ' t wiedzieć o istnieniu 'binned_statistic'. Prawdopodobnie wykorzystam go w niedalekiej przyszłości! Pisałem kod cythonowy, żeby osiągnąć podobne rzeczy lol! dzięki! –

+0

@imaluengo Wiedziałem, że może uzyskać średnie wartości, ale nie miałem pewności co do odchylenia standardowego i zadziałało! Źródłem jest ta odpowiedź - http://stackoverflow.com/a/29894547/3293881. Naprawdę fajnie jest mieć coś natywnie z tablicami NumPy! – Divakar

1

Pandy odbywa się za takiego zadania:

data=np.random.randint(1,5,20).reshape(10,2) 
import pandas 
pandas.DataFrame(data).groupby(0).mean() 

daje

  1 
0   
1 2.666667 
2 3.000000 
3 2.000000 
4 1.500000 
Powiązane problemy