2016-09-07 11 views
1

私は数字のリストを持っています。これらの数字にはサンプル平均とSDがあります。今、私は平均±SD、平均±-2SDおよび平均±-3SDの数字を調べようとしています。Python正規分布

ND1 = [np.mean(l)+np.std(l,ddof=1)]  
ND2 = [np.mean(l)-np.std(l,ddof=1)] 

m=sorted(l) 

print(m) 

ND68 = [] 

if ND2 > m and m< ND1: 

    ND68.append(m<ND2 and m>ND1) 
    print (ND68) 

ここに私の質問です: 1はリストで計算してアレンジする数でしたが は例えば、平均値+ -SDの一部で、私はこのようなコードを作りました。もしそうなら、私は間違っています。または、私がこれを解決するために使用できるパッケージがいくつかあります。

+0

数値は既にnumpy配列として保存されていますか? – James

答えて

2

これは役に立ちます。あなたが探している値をつかむためにnumpyを使用します。私の例では、正規分布の配列を作成し、ブール値のスライスを使用して+/- 1、2、または3標準偏差の範囲外の要素を返します。

import numpy as np 

# create a random normally distributed integer array 
my_array = np.random.normal(loc=30, scale=10, size=100).astype(int) 

# find the mean and standard dev 
my_mean = my_array.mean() 
my_std = my_array.std() 

# find numbers outside of 1, 2, and 3 standard dev 
# the portion inside the square brackets returns an 
# array of True and False values. Slicing my_array 
# with the boolean array return only the values that 
# are True 
out_std_1 = my_array[np.abs(my_array-my_mean) > my_std] 
out_std_2 = my_array[np.abs(my_array-my_mean) > 2*my_std] 
out_std_3 = my_array[np.abs(my_array-my_mean) > 3*my_std] 
1

あなたは正しいトラックにあります。あなたはリストlの平均と標準偏差を知っていますが、私は少しあいまいであると呼ぶつもりです。例えば、samplePopulationです。

これを複数の標準偏差の間隔で実行したいので、小さな関数を作成することをお勧めします。あまり余計な作業をすることなく複数回呼び出すことができます。また、私はlist comprehensionを使用するつもりですが、それはちょうどforループです。

import numpy as np 

def filter_by_n_std_devs(samplePopulation, numStdDevs): 
    # you mostly got this part right, no need to put them in lists though 
    mean = np.mean(samplePopulation) # no brackets needed here 
    std = np.std(samplePopulation) # or here 
    band = numStdDevs * std 

    # this is the list comprehension 
    filteredPop = [x for x in samplePopulation if x < mean - band or x > mean + band] 
    return filteredPop 

# now call your function with however many std devs you want 
filteredPopulation = filter_by_n_std_devs(samplePopulation, 1) 
print(filteredPopulation) 

ここ(あなたは無視して自由に感じるそうでない場合は、これらが何であるかを知らないかもしれないように見えるappendの使用に基づいて)リストの内包の翻訳です。要約するので

# remember that you provide the variable samplePopulation 
# the above list comprehension 
filteredPop = [x for x in samplePopulation if x < mean - band or x > mean + band] 

# is equivalent to this: 
filteredPop = [] 
for num in samplePopulation: 
    if x < mean - band or x > mean + band: 
     filteredPop.append(num) 

:あなたはあなたの平均とstd計算のうち、リストオブジェクトを作成する必要はありません

  • 関数呼び出しみましょうあなたがプラグインあなたsamplePopulationと、任意の数の値を手で入れずに手動で値を変更することなく、標準偏差を入力する
  • リスト内包表記はループの1行で、多かれ少なかれ、あなたの中に必要なフィルタリングを行うこともできます。
関連する問題