首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python正态分布

python正态分布
EN

Stack Overflow用户
提问于 2016-09-08 07:12:25
回答 2查看 234关注 0票数 1

我有一个数字列表,其中包含这些数字的样本均值和SD。现在我正在尝试找出mean+-SD,mean +-2SD和mean +-3SD的数字。例如,在mean+-SD部分,我编写了如下代码:

代码语言:javascript
复制
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.数字可以通过列表和排列来计算吗?如果是这样,我做错了哪一部分。或者有一些包我可以用来解决这个问题。

EN

回答 2

Stack Overflow用户

发布于 2016-09-08 07:31:41

这可能会有帮助。我们将使用numpy来获取您要查找的值。在我的示例中,我创建了一个正态分布数组,然后使用布尔切片返回+/- 1、2或3标准差之外的元素。

代码语言:javascript
复制
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]
票数 2
EN

Stack Overflow用户

发布于 2016-09-08 07:42:08

在这一点上,你是在正确的轨道上。你知道列表l的均值和标准差,不过我还是把它叫做samplePopulation

由于您希望对几个标准差间隔执行此操作,因此我建议创建一个小函数。你可以多次调用它,而不需要做太多的额外工作。此外,我还将使用list comprehension,它只是一行中的一个for循环。

代码语言:javascript
复制
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的使用,看起来您可能不知道这些是什么,否则请随意忽略)。

代码语言:javascript
复制
# 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)

因此,简单回顾一下:

calculations

  • The函数调用让您插入和任意数量的标准差,而无需进入并手动更改值
  • 列表理解是一行循环,或多或少,您甚至可以在其中进行您想要的过滤!
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39380316

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档