私は一連のデータ(X、Y)を持っています。私の独立変数の値Xはユニークではないので、複数の繰り返し値があるので、X_uniqueという固有の値のリストであるX_uniqueを含む新しい配列を出力したい。Y_mean、X_uniqueに対応するすべてのY値の平均。 Y_stdは、X_uniqueに対応するすべてのY値の標準偏差です。NumPy配列でグループ化された平均と標準偏差を実行する
x = data[:,0]
y = data[:,1]
私は一連のデータ(X、Y)を持っています。私の独立変数の値Xはユニークではないので、複数の繰り返し値があるので、X_uniqueという固有の値のリストであるX_uniqueを含む新しい配列を出力したい。Y_mean、X_uniqueに対応するすべてのY値の平均。 Y_stdは、X_uniqueに対応するすべてのY値の標準偏差です。NumPy配列でグループ化された平均と標準偏差を実行する
x = data[:,0]
y = data[:,1]
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])
あなたは、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. ]])
Didn ' 'binned_statistic'の存在を知っています。私はおそらく近い将来にそれをたくさん使うでしょう!私は同様の事を実現するためにcythonコードを書いていました。ありがとう! –
@imaluengo平均値を得ることができるとわかっていましたが、標準偏差についてはわかりませんでした。ソースはこの回答です - http://stackoverflow.com/a/29894547/3293881 NumPy配列でネイティブに何かを持っていると本当にきれいに見えます! – Divakar
パンダは、このようなタスクのために行われます。
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
を与えるあなたは[、最小完全、かつ検証を追加することができます例](http://stackoverflow.com/help/mcve)あなたの質問に? – Kasramvd
を参照してください。http://stackoverflow.com/questions/4373631/sum-array-by-number-in-numpy –
脇に:実際のデータを扱っている場合、おそらくもっと簡単に裸のものよりも['pandas'](http://pandas.pydata.org)を使ってください。あなたの 'data'が' ndarray'ではなく 'DataFrame'だった場合、' df.groupby(0)[1] .agg(["mean"、 "std"]) ')のようなものは動作します.. – DSM