python - 有没有一种有效的方法可以在 numpy 数组中创建 N 次伯努利试验的二项式实验?
问题描述
假设我有一枚硬币以概率 P 正面朝上。要进行的实验是继续掷硬币 x 次。这个实验要重复 1000 次。
问题是否有一种有效/矢量化的方法来生成随机 1(概率为 P)和 0(概率为 1-P)的数组?
如果我尝试这样的事情:
np.full(10,rng().choice((0,1),p= [.3,.7]))
整个数组填充了相同的选择。我见过涉及固定比例的零与一的解决方案。
a = np.ones(n+m)
a[:m] = 0
np.random.shuffle(a)
但是,我不确定如何使用此设置保持实验的随机性。
目前我只是按如下方式循环遍历每个迭代,但是一旦实验数量变大,它就会非常慢。
(实际实验涉及在两个连续的头被翻转时终止每个试验,这就是为什么代码中有一个while循环。为了使问题具体,我不想在这里解决这个问题。)
Set = [0,1]
T = np.ones(Episodes)
for i in range(Episodes):
a = rng().choice(Set, p=[(1 - p), p])
counter = 1
while True:
b = rng().choice(Set, p=[(1-p),p])
counter += 1
if (a == 1) & (b == 1):
break
a = b
T[i] = counter
任何见解将不胜感激,谢谢!
解决方案
@Quang Hong 和 @Kevin 提供的答案在上面的评论中列出。只需使用 default_rng() 重新发布,以便以后更容易参考。但他们是这里真正的英雄。
from numpy import default_rng as rng
rng().binomial(1, p = .7, size=(10,10))
rng().choice((0,1),p = [.3,.7], size=(10,10))
推荐阅读
- android - 多级可扩展列表视图
- function - 如何使用 groupby 按列对 Measure 进行计算?
- c - 测试比赛条件
- javascript - JS Array Destructing - 它是如何给出这个输出的?
- swift - 选择单元格时更新 UITableView 部分
- angularjs - 如何使用谷歌地方API中的函数添加谷歌API键和回调函数
- javascript - JS:根据其 onClick 值选择 DIV
- django - 对象列表的 Django REST 端点
- java - 错误:script.sh:在 Jenkins Pipeline Java 应用程序中未找到 docker
- c++ - 是否允许从 CppCon 示例中进行这些编译器优化?