假设我有一个很长的数组,我想返回该数组子集的随机排列。。。如何做到这一点而不必对整个数组进行排列?
我能想到的是
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
且小于N
的n
唯一整数。。。
我知道显式地做到这一点很容易,但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
模块可以更快。
然而,如果您特别想获得0
和N
之间的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)
。