2015-11-06 2 views
2

Я пытаюсь создать нормальное распределение в 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 = ... Имеет значение вне цикла. Я точно не понимаю, почему он не может перебираться.

+0

не произносят объект , Всегда плохая идея ... Следующее, что вы знаете, вы будете бормотать .... –

+0

Вы не говорите ... –

ответ

3

Есть три проблемы:

  1. Вы ищете .append, не .extend; это источник ошибки, так как .extend требует итеративный объект в качестве аргумента, поэтому он может добавлять к каждому из своих элементов. Вы добавляете один элемент - это то, что .append для
  2. Вашего уравнение для PDF является недействительным, вы должны иметь

    • 2 вместо 1 под квадратным корнем
    • отрицания внутри exp
    • ваша переменная variance используется в значении std

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

  3. Там нет такого понятия, как ++x в питоне, используйте x += 1

+0

'1/np.sqrt (2 * np.pi * variance ** 2) * np.exp (- (x-mean) ** 2/(2 * variance)) 'Внутри квадрата есть дисперсия ** 2 Я думаю! Спасибо! –

+1

Даниил, это далеко не правильно; проверьте https://en.wikipedia.org/wiki/Normal_distribution; variance = sigma^2 – lejlot

+0

Правильно! Я вижу сейчас! Спасибо за ваше терпение! –

0

TypeError: 'numpy.float64' object is not iterable

Насколько я вижу, normal_distribution является скалярным, таким образом, было бы prior.append(normal_distribution), не prior.extend(normal_distribution) ,

Btw - добавление в цикл не является удобным для работы, не говоря уже о идиоматическом.

Лучше использовать generator expression как

перед = [(F (х) для х в диапазоне (-100, 101)]

где f функция или lambda используется для генерации данных.

0

вы не хотите 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 

Изменение это приведет вас к следующей захватывающей части процесса отладки, чтобы определить, почему ваш цикл бесконечен :) Удачи

 Смежные вопросы

  • Нет связанных вопросов^_^