python (scipy) - установка элемента массива с ошибкой последовательности - PullRequest
1 голос
/ 31 октября 2011

Я хочу создать программу, которая вычисляет среднее значение из N случайных чисел, взятых из равномерного распределения случайных чисел. Программа должна работать для Ν = 10 100 000 000 100 000 100 000 100 000 случайных чисел. Затем я должен построить графиксреднее значение как функция от N.

Я сделал это:

from scitools.std import *
import matplotlib.pyplot as plt


N=10

distribution=[]
for i in range(1,7):   
    N*=10
    random_numbers=[random.uniform(0,1,size=N)]   
    distribution.append(random_numbers)


plt.semilogx(array(range(N)),array(distribution).mean())
plt.xlabel('N')
plt.grid(True)
plt.show()

Это дает мне ошибку в заголовке в строке, где я делаю график.Кроме того, если есть другой, более питонический способ сделать это, я буду признателен.

Спасибо.

Ответы [ 3 ]

1 голос
/ 31 октября 2011

Вычислите среднее значение () перед добавлением случайных чисел в список рассылки. Тогда у вас есть простой график списка из n элементов. Проблема в том, что вам нужен список скаляров, а не список массивов:

distribution=[]
for i in range(1,7):   
    N*=10
    random_numbers=[random.uniform(0,1,size=N)]   
    distribution.append(array(random_numbers).mean())
1 голос
/ 31 октября 2011
import scipy
import matplotlib.pyplot as plt

Ns=[10**i for i in range(1,7)]
means=[scipy.random.uniform(0,1,size=N).mean() for N in Ns]

plt.semilogx(Ns,means)
plt.xlabel('N')
plt.grid(True)
plt.show()
  1. Как уже упоминалось, distribution - это список массивов, с внутренними массивами, имеющими разные формы. Вы не можете сформировать NumPy вывести массив из такого объекта, вызвав np.array(distribution).
  2. По крайней мере, для целей построения, вам не нужно сохранять все распределение. Просто рассчитайте и сохраните средства. Краткий способ сделать то есть использовать понимание списка .
  3. Не используйте from module import * в сценариях . Это затрудняет отследить, откуда берутся переменные. from module import * было сделано (в основном) для использования в интерактивных сессиях, но обычно не рекомендуется для скриптов.
0 голосов
/ 31 октября 2011

Вы, кажется, добавляете список в список, например:

a = [[1], [2], [3]]

Попробуйте вместо этого код:

for i in range(1, 7):   
    N*=10
    distribution.append(random.uniform(0,1,size=N))

@ Раймонд предлагает взять среднее значение последовательности:

plt.semilogx(array(range(N)),array(sum(distribution) / float(len(distribution))))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...