2016-01-05 14 views
5

के साथ समूहीकृत औसत और मानक विचलन निष्पादित करना मेरे पास डेटा का एक सेट (एक्स, वाई) है। मेरे स्वतंत्र परिवर्तनीय मान एक्स अद्वितीय नहीं हैं, इसलिए कई बार दोहराए गए मान हैं, मैं एक नई सरणी को आउटपुट करना चाहता हूं: X_unique, जो X. Y_mean के अद्वितीय मानों की एक सूची है, X_unique से संबंधित सभी वाई मानों का माध्य है । Y_std, X_unique से संबंधित सभी वाई मानों का मानक विचलन।NumPy arrays

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

अगर आप किसी [मिनिमल, पूरा जोड़ सकते हैं देता है, और सत्यापन योग्य उदाहरण] (http://stackoverflow.com/help/mcve) अपने प्रश्न के लिए? – Kasramvd

+0

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

+1

पर एक नज़र डालें: इसके अलावा: यदि आप वास्तविक डेटा के साथ काम कर रहे हैं, तो शायद आपको यह आसान लगेगा नंगे numpy से ['pandas'] (http://pandas.pydata.org) का उपयोग करें। यदि आपका 'डेटा' 'ndarray' के बजाय 'डेटाफ्रेम' था, तो कुछ 'df.groupby (0) [1] .agg ([" mean "," std "])' काम करेगा .. – DSM

उत्तर

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

आप binned_statistic from scipy.stats कि विभिन्न आँकड़ों कार्यों एक -1 डी सरणी पार मात्रा में लागू करने के लिए समर्थन करता है का उपयोग कर सकते हैं। भाग प्राप्त करने के लिए, हमें शिफ्ट की स्थिति को क्रमबद्ध करने और प्राप्त करने की आवश्यकता होती है (जहां भाग बदलते हैं), जिसके लिए np.unique उपयोगी होगा। उन सभी रखें, तो एक कार्यान्वयन है -

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) 

binned_statistic की डॉक्स से, एक भी एक कस्टम आंकड़ा फ़ंक्शन का उपयोग कर सकते हैं:

समारोह: उपयोगकर्ता परिभाषित समारोह जो मूल्यों की एक -1 डी सरणी लेता है , और एक संख्यात्मक सांख्यिकीय आउटपुट करता है। प्रत्येक बिन में मानों पर इस फ़ंक्शन को कहा जाएगा। खाली डिब्बे का प्रतिनिधित्व फ़ंक्शन ([]), या NaN द्वारा किया जाएगा यदि यह कोई त्रुटि देता है।

नमूना इनपुट, आउटपुट -

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' के अस्तित्व के बारे में नहीं जानता। मैं शायद निकट भविष्य में इसका बहुत उपयोग करूँगा! मैं समान चीजों को प्राप्त करने के लिए साइथन कोड लिख रहा था! धन्यवाद! –

+0

@imaluengo मुझे पता था कि यह औसत मूल्य प्राप्त कर सकता है, लेकिन मुझे मानक विचलन के बारे में निश्चित नहीं था, और यह काम किया! स्रोत यह उत्तर है - http://stackoverflow.com/a/29894547/3293881। NumPy arrays के साथ कुछ मूल रूप से कुछ साफ करने के लिए वास्तव में साफ लगता है! – Divakar

1

पांडा इस तरह के कार्य के लिए किया जाता है:

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 
संबंधित मुद्दे