2016-01-05 20 views
5

Bir veri kümem var (X, Y). Bağımsız değişken değerlerim X benzersiz değildir, bu yüzden birden fazla tekrarlanan değer vardır, aşağıdakileri içeren yeni bir dizi çıkışı istiyorum: X_unique, X'in benzersiz değerlerinin bir listesidir. Y_mean, X_unique'e karşılık gelen tüm Y değerlerinin ortalamasıdır. . Y_std, X_unique'e karşılık gelen tüm Y değerlerinin standart sapması.NumPy dizileriyle gruplandırılmış ortalama ve standart sapma gerçekleştirme

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

Bir [Minimal, Tam ekleyebilir verir ve Doğrulanabilir örnek] (http://stackoverflow.com/help/mcve) sorunuza mı? – Kasramvd

+0

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

+1

'a bir göz atın. Aside: gerçek verilerle çalışıyorsanız, muhtemelen daha kolay bulacaksınız. ['pandas'] 'ı (http://pandas.pydata.org) çıplak numaradan daha fazla kullanın. Eğer 'data' 'ndarray' yerine bir' DataFrame' ise, df.groupby (0) [1] .agg (["mean", "std"]) 'gibi bir şey işe yarayacaktır. – DSM

cevap

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

Bir 1D yelpazesine yığınlarla uygulanacak çeşitli istatistik işlevleri destekler binned_statistic from scipy.stats kullanabilirsiniz. Parçalar elde etmek için, vardiyaların yerlerini değiştirip almamız gerekir (parçaların değiştiği yerler), bunun için np.unique faydalı olacaktır.

fonksiyonu: bir değerler 1D dizi götüren bir kullanıcı tanımlı fonksiyon biri de özel bir istatistik işlevini kullanabilirsiniz, binned_statistic ait Dokümanlar

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) 

- tüm bu getirirsek, bir uygulama var , ve tek bir sayısal istatistik çıktılar. Bu işlev, her kutudaki değerler üzerinde olarak adlandırılacaktır. Boş kutular işlevi ([]) veya bu bir hata döndürürse NaN ile temsil edilir.

Numune girdi, çıktı -

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 ' binned_statistic'nin varlığı hakkında bilgi. Muhtemelen yakın gelecekte bunu çok kullanacağım! Ben benzer şeyler lol elde etmek için cython kodu yazıyordu! Teşekkürler! –

+0

@imaluengo Ortalama değerler alabileceğini biliyordum, ama standart sapma konusunda emin değildim ve işe yaradı! Kaynak bu cevap - http://stackoverflow.com/a/29894547/3293881. NumPy dizileri ile doğal bir şey elde etmek için gerçekten temiz görünüyor! – Divakar

1

Pandalar böyle görev için yapılır:

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

  1 
0   
1 2.666667 
2 3.000000 
3 2.000000 
4 1.500000 
İlgili konular