2017-06-06 22 views
2

のは、どのようにして平均値と結合されたすべての3つの配列の標準偏差を計算する必要があります?形状合わせて平均値と標準偏差

(682, 89, 138) 
(2668, 76, 89) 
(491, 62, 48) 

と私はnumpyの配列を持っているとしましょうかそれらが同じ形であれば、np.stack()を使用して、結果の配列の平均と標準偏差を得ることができます。

異なるサイズでこれを行うことはできますか?または、平均と標準を得る前に私は形を変えなければならないでしょうか?

+1

flatten、append、compute –

+0

これらの配列の計算をどのように定義しますか?形状は異なりますが、エレメントの総数も異なります。 – hpaulj

+0

私は平均とstdの1つの値を取得したい。シェイプが一致すると、配列は他の配列の上に積み重ねられます。 – Char

答えて

3

式(standard deviationおよびmean)を使用して、すべての入力配列の2つのスカラー値を連結/スタッキングなしで(大規模なNumPy配列では高価になる可能性があります)計算することができます。平均で標準偏差のステップでそれをやろうとします。stdの計算でmeanを使うことができるようです。

を組み合わせた平均値の取得:だから

を、我々は平均/平均で始まります。このために、配列ごとに総和スカラーを取得します。次に、総和を求め、最後にすべての配列の要素数で除算します。

合成標準偏差値の取得:標準偏差について

に、我々は、式:

enter image description here

そこで、我々は、前のステップから得られた合わせた平均値を使用しますstdの式を使用して、2乗微分を求め、すべての配列の要素の合計数で除算し、平方根を適用します。

実装

さんはそうのような、入力配列がabあり、我々は一つの解を持つことになりましょう -

N = float(a.size + b.size) 
mean_ = (a.sum() + b.sum())/N 
std_ = np.sqrt((((a - mean_)**2).sum() + ((b - mean_)**2).sum())/N) 

検証用のサンプル実行

In [266]: a = np.random.rand(3,4,2) 
    ...: b = np.random.rand(2,5,3) 
    ...: 

In [267]: N = float(a.size + b.size) 
    ...: mean_ = (a.sum() + b.sum())/N 
    ...: std_ = np.sqrt((((a - mean_)**2).sum() + ((b - mean_)**2).sum())/N) 
    ...: 

In [268]: mean_ 
Out[268]: 0.47854757879348042 

In [270]: std_ 
Out[270]: 0.27890341338373376 

確認するには、スタックしてその後、関連するufuncs使用 - すべてのそれらの配列を保持するリストについては、入力

として配列の


一覧

In [271]: A = np.hstack((a.ravel(), b.ravel())) 

In [273]: A.mean() 
Out[273]: 0.47854757879348037 

In [274]: A.std() 
Out[274]: 0.27890341338373376 
を、我々はそうのように、それらを反復処理する必要がある -

A = [a,b,c] # input list of arrays 

N = float(sum([i.size for i in A])) 
mean_ = sum([i.sum() for i in A])/N 
std_ = np.sqrt(sum([((i-mean_)**2).sum() for i in A])/N) 

サンプルラン -

In [301]: a = np.random.rand(3,4,2) 
    ...: b = np.random.rand(2,5,3) 
    ...: c = np.random.rand(7,4) 
    ...: 

In [302]: A = [a,b,c] # input list of arrays 
    ...: N = float(sum([i.size for i in A])) 
    ...: mean_ = sum([i.sum() for i in A])/N 
    ...: std_ = np.sqrt(sum([((i-mean_)**2).sum() for i in A])/N) 
    ...: print mean_, std_ 
    ...: 
0.47703535428 0.293308550786 

In [303]: A = np.hstack((a.ravel(), b.ravel(), c.ravel())) 
    ...: print A.mean(), A.std() 
    ...: 
0.47703535428 0.293308550786 
+0

問題は、平均と標準を合わせたいアレイが1,000以上あることです。通常、 'combined = np.stack(配列内ではarrのために)'を使い、次にcombine.mean()とcombined.std()を呼び出すが、これはすべての配列を積み重ねることができると仮定している。 – Char

+0

@Char最後に編集を確認してください。 – Divakar

関連する問題