我有一个数字列表,包含这些数字的样本均值和标准差。现在我试图找出平均值+ -SD,平均值+ -2SD和平均值+ -3SD的数字。 例如,在mean + -SD的部分,我做了如下代码:
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.可以通过列表计算数字并安排。如果是这样,那部分我做错了。或者我可以使用一些包来解决这个问题。
答案 0 :(得分: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 :(得分: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)
所以回顾一下:
samplePopulation
和任意数量的标准差,而无需进入并手动更改值