在 python 中创建正态分布

Creating normal distribution in python

我尝试在 python 中创建正态分布。我编写了以下代码:

    prior = []
    variance = 20
    mean = 0.5
    x = -100

    while x <= 100:
            normal_distribution = 1/np.sqrt(1*np.pi*variance*variance)*np.exp(np.power(x-mean,2)/(2*variance*variance))
            prior.extend(normal_distribution)
            ++x

但是我遇到了类型错误:

TypeError: 'numpy.float64' object is not iterable

我试过 normal_distribution = ... 在 while 循环之外有一个值。 我不太明白为什么它不能迭代。

存在三个问题:

  1. 您要找的是.append,不是.extend;这是错误的来源,因为 .extend 需要 iterable 对象作为参数,因此它可以将 每个元素 附加到名单。您正在添加单个元素 - 这就是 .append
  2. 的作用
  3. 您的 pdf 方程式无效,您应该

    • 2代替1开平方根
    • 内部否定exp
    • 你的variance变量用的是std
    • 的意思

    1/np.sqrt(2*np.pi*variance)*np.exp(-(x-mean)**2/(2*variance))

  4. python里没有++x,用x += 1

TypeError: 'numpy.float64' object is not iterable

据我所知,normal_distribution 是标量值,因此它是 prior.append(normal_distribution),而不是 prior.extend(normal_distribution)

顺便说一句 - 在循环中追加对性能不友好,更不用说惯用语了。

最好用generator expression喜欢

prior = [(f(x) for x in range(-100, 101)]

其中 f 是您用来生成数据的函数或 lambda

你不想extend。如果你去查看 extend 的文档,你会发现

class list(object)  
def extend(self, t) Inferred type: (self: list[T], t: Iterable[T]) -> None   L.extend(iterable) -- extend list by appending elements from the utterable

因此您现在可以了解您的代码失败的原因。它确实在尝试迭代您传递给 extend 的对象,并且正如您正确指出的那样,它不能。所以,繁荣!

你要的是append

class list(object)  

def append(self, x) Inferred type: (self: list[T], x: T) -> None   L.append(object) -- append object to end

更改此设置将带您进入调试过程的下一个激动人心的部分,确定您的循环无限的原因:)祝您好运