Функция Python numpy.random.binomial()

#python-3.x #numpy

#python-3.x #numpy

Вопрос:

Я пытаюсь использовать функцию np.random.binomial () для имитации нескольких подбрасываний монет со следующими заданными параметрами:

  • Количество монет = 10
  • Количество переворотов на монету = 1
  • Вероятность выпадения головы P (H) = 0,5 «т.е. честная монета»
  • Количество попыток = 1000 000

Для получения результата я использовал следующий код:

[КОД]

 %%time    
tests = np.random.binomial(n=1, p=0.5, size=(int(1e6), 10))
test_sums = tests.sum(axis=1) # axis=1 to sum each row
(test_sums == 4).mean()
  

[ВЫВОД]

 (Wall time: 248 ms)
0.204992
  

Один из моих товарищей по команде рекомендовал следующий фрагмент, который использует меньше кода и кажется более эффективным:

[КОД]

 %%time    
tests = np.random.binomial(n=10, p=0.5, size=int(1e6))
(tests == 4).mean()
  

[ВЫВОД]

 Wall time: 68.9 ms
0.2048
  

Когда я могу использовать любой из следующих:

 tests = np.random.binomial(n=1, p=0.5, size=(int(1e6), 10))
tests = np.random.binomial(n=10, p=0.5, size=int(1e6))
  

Не могли бы вы, пожалуйста, посоветовать, в чем разница между этими двумя случаями? Зная это, результат, можно сказать, тот же.

Ответ №1:

Версия, рекомендованная вашим товарищем по команде, более эффективна и математически эквивалентна. Указание n=10 указывает binomial подбросить монету 10 раз и вернуть количество «успехов» (которые вы можете определить как «головы»). Другими словами, она выполняет то же, что и ваш код, но за один вызов функции.