¿Cómo puedo generar números aleatorios no repetitivos en numpy?
list = np.random.random_integers(20,size=(10))
random
numpy
numbers
non-repetitive
Academia
fuente
fuente
Respuestas:
numpy.random.Generator.choice
ofrece unreplace
argumento para muestrear sin reemplazo:from numpy.random import default_rng rng = default_rng() numbers = rng.choice(20, size=10, replace=False)
Si está en un NumPy anterior a 1.17, sin la
Generator
API, puede usarrandom.sample()
desde la biblioteca estándar:print(random.sample(range(20), 10))
También puede usar
numpy.random.shuffle()
y cortar, pero esto será menos eficiente:a = numpy.arange(20) numpy.random.shuffle(a) print a[:10]
También hay un
replace
argumento en lanumpy.random.choice
función heredada , pero este argumento se implementó de manera ineficiente y luego se dejó ineficaz debido a las garantías de estabilidad del flujo de números aleatorios, por lo que no se recomienda su uso. (Básicamente hace la cosa de mezclar y cortar internamente).fuente
import random
?random.sample(range(n), 10))
será eficiente incluso para muy grandesn
, ya que unrange
objeto es solo un contenedor pequeño que almacena valores de inicio, parada y paso, pero no crea la lista completa de enteros. En Python 2, puede reemplazarrange
conxrange
para obtener un comportamiento similar.Creo
numpy.random.sample
que no funciona bien ahora. Esta es mi manera:import numpy as np np.random.choice(range(20), 10, replace=False)
fuente
range(n)
(oarange(n)
) como primer argumento dechoice
, es equivalente a pasarn
, por ejemplochoice(20, 10, replace=False)
.np.random.choice(a, size, replace=False)
es muy lento para grandesa
: en mi máquina, alrededor de 30 ms para a = 1M.n
uso muy extensonumpy.random.Generator.choice
(comenzando con numpy v1.17)Años más tarde, es hora de elegir 40000 de 10000 ^ 2 (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
(¿Por qué elegir 40000 de 10000 ^ 2 Para generar grandes? Scipy.sparse.random matrices - scipy 1.4.1 usos
np.random.choice( replace=False )
., Leeeentos)Punta del sombrero para la gente numpy.random.
fuente
Puede obtener esto ordenando también:
random_numbers = np.random.random([num_samples, max_int]) samples = np.argsort(random_numbers, axis=1)
fuente
Simplemente genere una matriz que contenga el rango requerido de números, luego revuélvalos intercambiando repetidamente uno aleatorio con el elemento 0 de la matriz. Esto produce una secuencia aleatoria que no contiene valores duplicados.
fuente