2016-01-05 20 views
5

私は一連のデータ(X、Y)を持っています。私の独立変数の値Xはユニークではないので、複数の繰り返し値があるので、X_uniqueという固有の値のリストであるX_uniqueを含む新しい配列を出力したい。Y_mean、X_uniqueに対応するすべてのY値の平均。 Y_stdは、X_uniqueに対応するすべてのY値の標準偏差です。NumPy配列でグループ化された平均と標準偏差を実行する

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

脇に:実際のデータを扱っている場合、おそらくもっと簡単に裸のものよりも['pandas'](http://pandas.pydata.org)を使ってください。あなたの 'data'が' ndarray'ではなく 'DataFrame'だった場合、' 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

あなたは、1Dアレイ全体の塊に適用される各種統計機能をサポートしていbinned_statistic from scipy.statsを使用することができます。チャンクを取得するには、シフト(チャンクが変更される)の位置をソートして取得する必要があります。この場合、np.uniqueが便利です。

機能:値の1次元配列を受け取り、ユーザー定義関数1は、カスタムの統計関数を使用することができ、binned_statisticのドキュメントから

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) 

- すべてのものを置く、ここに実装です、 と単一の数値統計を出力します。この関数は、各ビンの値に対して と呼ばれます。空のビンは 関数([])で表されます。これがエラーを返す場合は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'の存在を知っています。私はおそらく近い将来にそれをたくさん使うでしょう!私は同様の事を実現するためにcythonコードを書いていました。ありがとう! –

+0

@imaluengo平均値を得ることができるとわかっていましたが、標準偏差についてはわかりませんでした。ソースはこの回答です - http://stackoverflow.com/a/29894547/3293881 NumPy配列でネイティブに何かを持っていると本当にきれいに見えます! – 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 
関連する問題