I am trying to create a huge boolean
matrix which is randomly filled with True
and False
with a given probability p
.起初我使用这段代码:
N = 30000
p = 0.1
np.random.choice(a=[False, True], size=(N, N), p=[p, 1-p])
但遗憾的是,它似乎并没有因为这个大的 N
而终止。所以我试图通过这样做将它分成单行的生成:
N = 30000
p = 0.1
mask = np.empty((N, N))
for i in range (N):
mask[i] = np.random.choice(a=[False, True], size=N, p=[p, 1-p])
if (i % 100 == 0):
print(i)
现在,发生了一些奇怪的事情(至少在我的设备上):前 ~1100 行的生成速度非常快——但之后,代码变得非常慢。为什么会这样?我在这里想念什么? Are there better ways to create a big matrix which has True
entries with probability p
and False
entries with probability 1-p
?
编辑:你们中的许多人都认为 RAM 会是个问题:因为运行代码的设备有将近 500GB 的 RAM,所以这不会成为问题。
原文由 zimmerrol 发布,翻译遵循 CC BY-SA 4.0 许可协议
真的很惊讶还没有人提到这个解决方案..
这条线
运行 NXN 伯努利试验。 (在你的例子中,有 900M!)伯努利试验只是一个随机试验,有两种可能的结果,概率为 p 和 1-p。
n 个伯努利试验的总和,每个试验的概率为 p,可以用 二项分布 建模。
我们可以利用这个事实来随机模拟 True 元素的总数。使用 NumPy,
现在我们可以通过随机选择 row 和 col 索引 而不用替换 来随机确定每个 True 元素的 _位置_。
现在我们可以填充压缩稀疏行 (CSR) 矩阵。
请注意,此解决方案避免了存储 和计算 900M 布尔值。
有趣的是,在偶然发现这个 问题之前,我写了一个几乎相同 的问题。