numpy 最快的方法来生成 Shuffle 范围数组从零到x

chhkpiq4  于 4个月前  发布在  其他
关注(0)|答案(1)|浏览(30)

我试图找到一种最快的方法来生成一个随机索引数组。一个随机范围从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到某个数字的所有整数的数组,这实际上相当于生成随机索引。所以我无法摆脱这样一种感觉,即有一种更快的方法可以实现我想要实现的目标。有吗?

pftdvrlh

pftdvrlh1#

如果你从测试二中删除范围,那么你会看到变化,发现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


还有一个方法是np.random.Generator.permutation
这个方法的测试是

test3 = "matrix[0][:] = rng.permutation(idxlen)"

对于idxlen=1000

0.1567758999990474

对于idxlen=10000

1.4174363000020094

对于idxlen=100000

13.964398899999651

最后,比较所有三个之间的时间

number=10000图形


的数据
Code for graph

相关问题