2016-09-07 6 views
1

Ich habe eine Liste von Zahlen, mit Beispiel Mittelwert und SD für diese Zahlen. Im Moment versuche ich, die Zahlen aus dem Mittelwert + -SD, Mittelwert + -2SD und Mittelwert + -3SD herauszufinden. Zum Beispiel in dem Teil der Mittel + -SD, machte ich den Code wie folgt aus:Python Normalverteilung

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) 

Hier ist meine Frage: 1. Kann durch die Liste und ordnen berechnete Zahl. Wenn ja, welchen Teil mache ich falsch? Oder es gibt ein Paket, mit dem ich das Problem lösen kann.

+0

Sind die Nummern bereits als numpy Array gespeichert? – James

Antwort

2

Dies könnte helfen. Wir werden numpy verwenden, um die Werte zu erhalten, die Sie suchen. In meinem Beispiel erzeuge ich ein normalverteiltes Array und verwende dann boolesches Slicing, um die Elemente zurückzugeben, die außerhalb von +/- 1, 2 oder 3 Standardabweichungen liegen.

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

Sie sind auf dem richtigen Weg dorthin. Sie kennen den Mittelwert und die Standardabweichung Ihrer Liste l, obwohl ich es etwas weniger eindeutig nennen werde, sagen wir samplePopulation.

Da Sie dies für mehrere Intervalle der Standardabweichung tun möchten, empfehle ich, eine kleine Funktion zu erstellen. Sie können es mehrmals ohne viel zusätzliche Arbeit aufrufen. Ich werde auch eine list comprehension verwenden, die nur eine for Schleife in einer Zeile ist.

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) 

Hier ist eine Übersetzung der Liste Verständnis (basierend auf der Nutzung von append es sieht aus wie Sie vielleicht nicht wissen, was diese sind, sonst fühlen Sie sich frei zu ignorieren).

# 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) 

So zu rekapitulieren:

  • Sie müssen keine Liste Objekt aus dem Mittelwert und Standardberechnungen
  • Der Funktionsaufruf lässt Sie in Ihrem Stecker machen samplePopulation und eine beliebige Anzahl von Standardabweichungen, die Sie wünschen, ohne hineinzugehen und den Wert manuell zu ändern
  • List Comprehensions sind eine Linie für Schleifen, mehr oder weniger, und Sie können sogar die Filterung tun, die Sie direkt darin wollen!
Verwandte Themen