如何在numpy中生成非重复随机数?
list = np.random.random_integers(20,size=(10))
Answers:
numpy.random.Generator.choice
提供一个replace
参数以进行采样而无需替换:
from numpy.random import default_rng
rng = default_rng()
numbers = rng.choice(20, size=10, replace=False)
如果您使用的是1.17之前的NumPy,没有Generator
API,则可以random.sample()
从标准库中使用:
print(random.sample(range(20), 10))
您也可以使用numpy.random.shuffle()
和切片,但这会降低效率:
a = numpy.arange(20)
numpy.random.shuffle(a)
print a[:10]
replace
在遗留numpy.random.choice
函数中也有一个参数,但是由于随机数流的稳定性保证,该参数的实现效率低下,然后变得效率低下,因此不建议使用它。(它基本上是在内部执行随机播放和切片操作。)
import random
吗
random.sample(range(n), 10))
即使对于非常大n
的range
对象也将非常有效,因为对象只是存储开始,结束和步长值的小包装,而不会创建整数的完整列表。在Python 2中,您可以替换range
为xrange
以获得类似的行为。
我认为numpy.random.sample
现在不行。这是我的方式:
import numpy as np
np.random.choice(range(20), 10, replace=False)
range(n)
(或arange(n)
)作为第一个参数choice
,它等效于just pass n
,例如choice(20, 10, replace=False)
。
np.random.choice(a, size, replace=False)
对于大型a
计算机来说非常慢-在我的机器上,对于1M大约30毫秒。
n
使用的时间和内存问题numpy.random.Generator.choice
(从numpy v1.17开始)
几年后,从10000 ^ 2中选择40000(Numpy 1.8.1,imac 2.7 GHz)的一些时间安排:
import random
import numpy as np
n = 10000
k = 4
np.random.seed( 0 )
%timeit np.random.choice( n**2, k * n, replace=True ) # 536 µs ± 1.58 µs
%timeit np.random.choice( n**2, k * n, replace=False ) # 6.1 s ± 9.91 ms
# https://docs.scipy.org/doc/numpy/reference/random/index.html
randomstate = np.random.default_rng( 0 )
%timeit randomstate.choice( n**2, k * n, replace=False, shuffle=False ) # 766 µs ± 2.18 µs
%timeit randomstate.choice( n**2, k * n, replace=False, shuffle=True ) # 1.05 ms ± 1.41 µs
%timeit random.sample( range( n**2 ), k * n ) # 47.3 ms ± 134 µs
(为什么要从10000 ^ 2中选择40000?要生成大的
scipy.sparse.random
矩阵-scipy 1.4.1使用np.random.choice( replace=False )
slooooow。)
给numpy.random人士戴上帽子。
只需生成一个包含所需数字范围的数组,然后通过将一个随机数与该数组中的第0个元素重复交换就可以对它们进行混洗。这将产生一个不包含重复值的随机序列。