python - 高效随机抽样

标签 python math random

我的问题很简单: 我有一个包含 2000 万个 float 的数组。在该数组中,每个 float 都有被随机更改的概率 p

最简单的方法是遍历数组,执行 if (rand(0,1) < p) then modify。

然而,即使是并行化,它也非常慢,我在想是否有更快的方法来随机获取一些索引进行修改。

我的第一个想法是选取 p * n 个随机数,其中 n 是数组中 float 的总数,但是,这并不完全代表概率分布,因为在第一种情况下没有任何东西可以保证只有 p*n float 将被修改。

想法?

PD:我正在使用 python 来实现,可能之前有人遇到过这个问题并在库中实现了一些东西,但我找不到它。

最佳答案

首先,如果 p 很高,即 >= 0.5,无论您做什么都不会节省太多时间,因为您仍然可能访问大部分元素。但是,如果 p 较低,您可以从 binomial distribution 中提取n=20M 和您确定要触摸多少元素的概率。

In [23]: np.random.binomial(20*10**6, 0.1)
Out[23]: 1999582

In [24]: np.random.binomial(20*10**6, 0.99999)
Out[24]: 19999801

In [25]: np.random.binomial(20*10**6, 0.5)
Out[25]: 10001202

In [26]: np.random.binomial(20*10**6, 0.0001)
Out[26]: 1986
[...]
In [30]: np.random.binomial(20*10**6, 0.0001)
Out[30]: 1989

In [31]: np.random.binomial(20*10**6, 0.0001)
Out[31]: 1988

这个数字是假设 n 次试验的成功次数,每次试验都有 p 的成功机会,这正是您的情况。

关于python - 高效随机抽样,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51011601/

相关文章:

Python imread 错误 : "Unsupported BMP bitfields layout"

Mysql-> rand() 之后分组

android - 如何计算二维点之间的标准偏差

c++ - 如何有效地计算两点之间的角度?

javascript - 更改 `setInterval` 内元素的背景颜色

vba - 在VBA中重复随机数

python - 如何使用 Pandas 分析来分析大型数据集?

python - 属性错误 : module 'cv2.cv2' has no attribute 'xfeatures2d' [Opencv 3. 4.3]

python - SciTE -1073741819中的Python退出代码

java - 如何找到两个角度之间的最小过渡