如何在python中获得范围内整数的随机排列,而不需要对整个数组进行排列



假设我有一个很长的数组,我想返回该数组子集的随机排列。。。如何做到这一点而不必对整个数组进行排列?

我能想到的是

import numpy
N = 10000000 # total number of elements
n = 20 # number of elements that I am interested in getting from the permutation
x = numpy.random.permutation(numpy.arange(N))[:n] # this permutes the whole array

基本上,我需要选择大于或等于0且小于Nn唯一整数。。。

我知道显式地做到这一点很容易,但python中的任何模块中都有类似于MATLAB中randperm(N,n)的numpy方法或函数吗?

到目前为止,我只发现了一些python示例,它们是我在这里描述的变体。

如果您有一个用于超长数组的惰性生成器,那么使用标准random模块可能会更高效。

N = 10000000
import numpy as np
%timeit np.random.choice(range(N), size=20, replace=False)
# 1.52 s ± 20.2 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
%timeit np.random.choice(np.arange(N), size=20, replace=False)
# 376 ms ± 3.95 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
import random
%timeit np.array(random.sample(range(N), k=20))
# 19 µs ± 86.9 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

因此,如果您有一个生成器/迭代器,而不是内存中的数组,那么random模块可以更快。

然而,如果您特别想获得0N之间的k数字,最简单的方法可能是使用类似的东西

%timeit np.random.choice(N, size=20, replace=False)
# 410 ms ± 12.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

尽管它稍微慢一些。

假设您已经拥有arr,则可以使用np.random.choice(arr, size=20, replace=False)

最新更新