gpt4 book ai didi

python - 无需替换即可高效生成多个 numpy.random.choice 实例

转载 作者:太空宇宙 更新时间:2023-11-03 13:40:40 26 4
gpt4 key购买 nike

我是 Python 新手。阅读时,请提及有关改进我的 Python 代码的方法的任何其他建议。

问题:如何在 Python 中生成包含随机数的 8xN 维数组? 约束是此数组的每一列必须包含 8 次抽取,而不是从整数集 [1,8] 中进行替换。更具体地说,当 N = 10 时,我想要这样的东西。

[[ 6.  2.  3.  4.  7.  5.  5.  7.  8.  4.]
[ 1. 4. 5. 5. 4. 4. 8. 5. 7. 5.]
[ 7. 3. 8. 8. 3. 8. 7. 3. 6. 7.]
[ 3. 6. 7. 1. 5. 6. 2. 1. 5. 1.]
[ 8. 1. 4. 3. 8. 2. 3. 4. 3. 3.]
[ 5. 8. 1. 7. 1. 3. 6. 8. 1. 6.]
[ 4. 5. 2. 6. 2. 1. 1. 6. 4. 2.]
[ 2. 7. 6. 2. 6. 7. 4. 2. 2. 8.]]

为此,我使用以下方法:

import numpy.random
import numpy
def rand_M(N):
M = numpy.zeros(shape = (8, N))
for i in range (0, N):
M[:, i] = numpy.random.choice(8, size = 8, replace = False) + 1
return M

在实践中 N 将是 ~1e7。上面的算法在时间上是 O(n),当 N=1e3 时大约需要 0.38 秒。因此,当 N = 1e7 时,时间约为 1 小时(即 3800 秒)。必须有一种更有效的方法。

定时函数

from timeit import Timer 
t = Timer(lambda: rand_M(1000))
print(t.timeit(5))
0.3863314103162543

最佳答案

创建一个指定形状的随机数组,然后沿您希望保持限制的轴进行排序,从而为我们提供了一个矢量化且非常有效的解决方案。这将基于此 smart answerMATLAB randomly permuting columns differently .这是实现-

sample 运行-

In [122]: N = 10

In [123]: np.argsort(np.random.rand(8,N),axis=0)+1
Out[123]:
array([[7, 3, 5, 1, 1, 5, 2, 4, 1, 4],
[8, 4, 3, 2, 2, 8, 5, 5, 6, 2],
[1, 2, 4, 6, 5, 4, 4, 3, 4, 7],
[5, 6, 2, 5, 8, 2, 7, 8, 5, 8],
[2, 8, 6, 3, 4, 7, 1, 1, 2, 6],
[6, 7, 7, 8, 6, 6, 3, 2, 7, 3],
[4, 1, 1, 4, 3, 3, 8, 6, 8, 1],
[3, 5, 8, 7, 7, 1, 6, 7, 3, 5]], dtype=int64)

运行时测试 -

In [124]: def sortbased_rand8(N):
...: return np.argsort(np.random.rand(8,N),axis=0)+1
...:
...: def rand_M(N):
...: M = np.zeros(shape = (8, N))
...: for i in range (0, N):
...: M[:, i] = np.random.choice(8, size = 8, replace = False) + 1
...: return M
...:

In [125]: N = 5000

In [126]: %timeit sortbased_rand8(N)
100 loops, best of 3: 1.95 ms per loop

In [127]: %timeit rand_M(N)
1 loops, best of 3: 233 ms per loop

因此,等待 120x 加速!

关于python - 无需替换即可高效生成多个 numpy.random.choice 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31955660/

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