我想加速下面的代码,即for循环.有没有办法在numpy做到这一点?

import numpy as np
# define seend and random state
rng = np.random.default_rng(0)
# num of throws
N = 10**1
# max number of trials
total_n_trials = 10
# generate the throws' distributions of "performace" - overall scores
# mu_throws = rng.normal(0.7, 0.1, N)
mu_throws = np.linspace(0,1,N)

all_trials = np.zeros(N*total_n_trials)
for i in range(N):
    # generate trials per throw as Bernoulli trials with given mean
    all_trials[i*total_n_trials:(i+1)*total_n_trials] = rng.choice([0,1], size=total_n_trials, p=[1-mu_throws[i],mu_throws[i]])
    

更多解释-我想生成N个伯努利试验序列(即0和1,称为throws),其中每个序列都有一个由另一个数组(mu_throws)中的值给出的平均值(概率p).这可以从正态分布中采样,或者在本例中,为了简单起见,我将其看作是一个从0到1的N=10个数字的序列.上述方法可行,但速度较慢.我希望N至少是10^4美元,然后total_n_trials可以是数百到(数万)千的任何东西(这会运行多次).我判断了以下post个,但没有找到答案.我还知道numpy random choice可以生成多维数组,但我没有找到为不同的行设置不同的p集的方法.基本上与我在上面所做的一样,只是reshape 了:

all_trials.reshape(N,-1)
array([[0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 1., 1., 0., 0.],
       [1., 0., 0., 1., 0., 0., 0., 1., 1., 0.],
       [1., 0., 1., 0., 0., 1., 0., 1., 0., 1.],
       [1., 0., 1., 0., 0., 0., 1., 1., 0., 0.],
       [1., 0., 0., 1., 0., 1., 0., 1., 1., 0.],
       [1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1., 1., 1., 1., 1., 1.]])

我也想过这trick个,但还没有想到如何将其用于伯努利试验.谢谢你的提示.

推荐答案

N = 11
mu_throws = np.linspace(0,1,N)
total_n_trials = 10_000

rng = np.random.default_rng(0)
all_trials = (rng.random((N, total_n_trials)).T<mu_throws).T.astype(int)
all_trials # shape (N, total_n_trials)

输出:

array([[0, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 0],
       [1, 0, 0, ..., 0, 0, 0],
       ...,
       [1, 0, 1, ..., 1, 1, 1],
       [1, 1, 1, ..., 0, 1, 1],
       [1, 1, 1, ..., 1, 1, 1]])

基本上,我所做的是在区间[0, 1)内生成随机实数,并将它们转换为给定概率的布尔结果(在mu_throws中).

如果将mu_throws(实际概率平均值)与all_trials中估计的概率进行比较,则得出:

np.c_[mu_throws, all_trials.mean(1)]

输出:

array([[0.    , 0.    ],
       [0.1   , 0.1003],
       [0.2   , 0.1963],
       [0.3   , 0.305 ],
       [0.4   , 0.4006],
       [0.5   , 0.5056],
       [0.6   , 0.5992],
       [0.7   , 0.6962],
       [0.8   , 0.7906],
       [0.9   , 0.8953],
       [1.    , 1.    ]])

对于示例中的Ntotal_n_trials个值,我的机器上所需的时间是0.00014019012451171875秒,而您的循环时间是0.0012738704681396484秒.

Python相关问答推荐

从numpy数组和参数创建收件箱

更改键盘按钮进入'

如何在给定的条件下使numpy数组的计算速度最快?

在pandas中使用group_by,但有条件

Pandas—在数据透视表中占总数的百分比

如何指定列数据类型

如何在两列上groupBy,并使用pyspark计算每个分组列的平均总价值

如何找出Pandas 图中的连续空值(NaN)?

Flask运行时无法在Python中打印到控制台

jsonschema日期格式

Python—在嵌套列表中添加相同索引的元素,然后计算平均值

用fft计算指数复和代替求和来模拟衍射?

查找数据帧的给定列中是否存在特定值

函数()参数';代码';必须是代码而不是字符串

为什么fizzbuzz在两个数字的条件出现在一个数字的条件之后时不起作用?

Pip:卸载`-e`安装过程中安装的所有pkgs

为什么任何一个HTML页面在保存到文件后都会变大6个字节?

具有数值数组问题的递归矩阵构造(广播?)

更新-如何与一个我无法使用python获得的按钮进行交互-Selify?

在伪子进程中模拟标准输出.打开