gpt4 book ai didi

python - 如何创建 n 个非零随机小数的 L 个列表,其中每个列表总和为 1.0?

转载 作者:行者123 更新时间:2023-11-28 21:50:26 25 4
gpt4 key购买 nike

寻找一种快速的方法来创建 L 数量的 n 小数列表,其总和为 1。每个数字应 >= 0.01

期望的输出:

其中 L = 200,n = 6

[0.20, 0.22, 0.10, 0.06, 0.04, 0.38]
[0.32, 0.23, 0.18, 0.07, 0.05, 0.15]
...
# There are 200 of these

其中 L = 200,n = 3

[0.90, 0.10, 0.10]
[0.35, 0.25, 0.30]
...
# There are also 200 of these

我想不出实际解决方案的棘手部分是确保每个列表中没有零。当 n 达到很大的数字时,这变得特别困难。您如何相应地分配值 1 的片段?

最佳答案

这应该非常快,因为它使用了 numpy。

如果它得到任何 0.0,它将自动重复随机化,但这不太可能。 while 循环是在 OP 将非零要求调整为高于 0.01 之前编写的。要解决此问题,您可以修改 while block 以包含整个后续代码,并以类似于检测零所示的方式在末尾计算违反任何所需约束的次数。但是当 L 与违反约束的概率相比很大时,这可能会变慢。从某种意义上说,最容易符合>0.0的原始要求。

在 while 循环之后,L x n 矩阵的每个元素均匀分布在 (0.0,1.0) 上,没有任何 0 或 1。每行求和并用于形成比例矩阵,然后矩阵乘以随机矩阵以获得自动求和为 1.0 的行

 import numpy as np
def random_proportions(L,n):
zeros = 1
while zeros>0:
x = np.random.random(size=(L,n))
zeros = np.sum(x==0.0)
sums = x.sum(axis=1)
scale = np.diag(1.0/sums)
return np.dot(scale, x)

编辑:上面生成了一个 LxL 矩阵用于缩放,这是内存效率低下的。在L=10**6之前会OOM。我们可以通过使用 this answer 建议的广播规范化程序来解决这个问题

import numpy as np
def random_proportions(L,n):
zeros = 1
while zeros>0:
x = np.random.random(size=(L,n))
zeros = np.sum(x==0.0)
sums = x.sum(axis=1).reshape(L,1) # reshape for "broadcasting" effect
return x/sums

第二个版本将在具有 16GB 内存的 AMD FX-8150 上在大约 1/3 秒内计算出 100 万个大小为 10 的列表:

%timeit l = random_proportions(1000000,10)
1 loops, best of 3: 347 ms per loop

关于python - 如何创建 n 个非零随机小数的 L 个列表,其中每个列表总和为 1.0?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31909547/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com