如何在不排列 python 中的整个数组的情况下获得范围内整数的随机排列?
How to get a random permutation of integers inside range without permuting the whole array in python?
假设我有一个很长的数组,我想 return 对该数组的一个子集进行随机排列...我该怎么做而不必排列整个数组?
我能想到的方式是
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
基本上,我需要 select n
大于或等于 0
且小于 N
...
的唯一整数
我知道明确地做到这一点很容易,但是 python 中的任何模块中是否有像 MATLAB 中的 randperm(N,n)
一样工作的 numpy 方法或函数?
到目前为止,我只找到 python 个示例,这些示例是我在此处描述的内容的变体。
你可以使用 np.random.choice(arr, size=20, replace=False)
假设你已经有 arr
.
如果你有一个用于超长数组的惰性生成器,使用标准 random
module.
可能更有效
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)
因此,如果您有 generator/iterator 而不是内存数组,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)
虽然速度稍慢
假设我有一个很长的数组,我想 return 对该数组的一个子集进行随机排列...我该怎么做而不必排列整个数组?
我能想到的方式是
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
基本上,我需要 select n
大于或等于 0
且小于 N
...
我知道明确地做到这一点很容易,但是 python 中的任何模块中是否有像 MATLAB 中的 randperm(N,n)
一样工作的 numpy 方法或函数?
到目前为止,我只找到 python 个示例,这些示例是我在此处描述的内容的变体。
你可以使用 np.random.choice(arr, size=20, replace=False)
假设你已经有 arr
.
如果你有一个用于超长数组的惰性生成器,使用标准 random
module.
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)
因此,如果您有 generator/iterator 而不是内存数组,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)
虽然速度稍慢