生成从 0 到 x 的打乱范围数组的最快方法

问题描述 投票:0回答:1

我正在尝试找到生成随机索引数组的最快方法。可以这么说,从 0 到数字的随机范围。

目前我比较了这两种方法:

setup = "import numpy as np; idxlen = 1000; rng = np.random.default_rng(); matrix = -np.ones([100,idxlen],dtype=int)"
test1 = "rand_idxs = np.arange(idxlen); 
         rng.shuffle(rand_idxs); 
         matrix[0][:] = rand_idxs"
test2 = "matrix[0][:] = rng.choice(range(idxlen),idxlen,replace=False)"
print(timeit.timeit(test1, setup, number = 10000))
print(timeit.timeit(test2, setup, number = 10000))

返回以下时间:

0.1846354000736028
0.950088300043717

我假设在幕后, rng.shuffle() 方法会随机化过去数组的索引,并根据这些索引重新排列它。现在,由于我正在生成一个包含从 0 到某个数字的每个整数的数组,因此这实际上对应于生成随机索引。因此,我无法摆脱这样的感觉:有一种更快的方法可以实现我想要实现的目标。有吗

python numpy random range
1个回答
0
投票

如果您从测试二中删除范围,那么您会看到变化并发现

test2
比第一个更快

import timeit
setup = "import numpy as np; idxlen = 1000; rng = np.random.default_rng(); matrix = -np.ones([100,idxlen],dtype=int)"
test1 = "rand_idxs = np.arange(idxlen); rng.shuffle(rand_idxs); matrix[0][:] = rand_idxs"
test2 = "matrix[0][:] = rng.choice(idxlen,idxlen,replace=False)"
print(timeit.timeit(test1, setup, number = 10000))
print(timeit.timeit(test2, setup, number = 10000))

现在进行测试

对于 idxlen=1000

0.15045420000024023
0.24143790000016452

对于 idxlen=10000

1.4334205999984988
1.3395810999973037

对于 idxlen=100000

14.489788099999714
8.599601199999597
© www.soinside.com 2019 - 2024. All rights reserved.