如何在NumPy中对此循环进行矢量化?它使用来自NumPy的binomial()
函数的抽样来估计特定类型的55个事件中m
的概率发生的概率,m
发生的概率为5%;即估计55Cm。(0.05)^ m。(0.95)^(55-m)。其中55Cm = 55!/(m!。(55-m)!)
import numpy as np
M = 7
m = np.arange(M+1)
ntrials = 1000000
p = np.empty(M+1)
for r in m:
p[r] = np.sum(np.random.binomial(55, 0.05, ntrials)==r)/ntrials
答案 0 :(得分:1)
以下是等效代码:
p = np.zeros(M+1)
print p
我想你不打算让你的输出总是全为零,但确实如此!因此,首先要做的是在dtype=float
调用中添加np.sum()
参数。除此之外,我们可以像这样对整个事物进行矢量化:
samples = np.random.binomial(55, 0.05, (ntrials, M+1))
p = np.sum(samples == m, dtype=float, axis=0) / ntrials
这会产生等效但不相同的结果。原因是随机数生成是以不同的顺序完成的,因此您将得到一个“正确”但与旧代码不同的答案。如果您想要之前的结果相同,可以通过将第一行更改为:
来实现samples = p.random.binomial(55, 0.05, (M+1, ntrials)).T
然后你以与以前相同的顺序绘制,没有真正的性能损失。