¿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.choiceofrece unreplaceargumento 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
GeneratorAPI, 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
replaceargumento en lanumpy.random.choicefunció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 unrangeobjeto 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 reemplazarrangeconxrangepara obtener un comportamiento similar.Creo
numpy.random.sampleque 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.nuso 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