2011-04-29 8 views
68

Estoy a la espera de otro desarrollador para terminar una pieza de código que devolver una matriz de forma np (100,2000) con los valores de cualquiera de -1,0, o 1.consistentemente crear misma matriz aleatoria numpy

Mientras tanto, quiero crear aleatoriamente un conjunto de las mismas características para que pueda tener una ventaja en mi desarrollo y prueba. La cuestión es que quiero que este conjunto creado aleatoriamente sea el mismo cada vez, por lo que no estoy probando contra un arreglo que cambia constantemente de valor cada vez que vuelvo a ejecutar mi proceso.

Puedo crear mi matriz de esta manera, pero ¿hay alguna manera de crearla para que sea la misma cada vez? Puedo desenterrar el objeto y desmantelarlo, pero me pregunto si hay otra manera.

r = np.random.randint(3, size=(100, 2000)) - 1 

Respuesta

71

Simplemente inicialice el generador de números aleatorios con un valor fijo, p.

numpy.random.seed(42) 

De esta manera, siempre obtendrá la misma secuencia de números aleatorios.

+0

mucho mejor que decapado y deserialiación. gracias Sven – Idr

+30

Alguien se coló en la función 'numpy.random.seed()' cuando no estaba prestando atención. :-) Intencionalmente lo dejé fuera del módulo original. Recomiendo que las personas usen sus propias instancias de 'RandomState' y que pasen esos objetos. –

+5

Robert es uno de los principales contribuyentes al numpy. Creo que deberíamos dar algo de peso a su opinión. – deprecated

140

Crea tu propia instancia de numpy.random.RandomState() con tu semilla elegida. No use numpy.random.seed() excepto para trabajar con bibliotecas inflexibles que no le permiten pasar su propia instancia RandomState.

[~] 
|1> from numpy.random import RandomState 

[~] 
|2> prng = RandomState(1234567890) 

[~] 
|3> prng.randint(-1, 2, size=10) 
array([ 1, 1, -1, 0, 0, -1, 1, 0, -1, -1]) 

[~] 
|4> prng2 = RandomState(1234567890) 

[~] 
|5> prng2.randint(-1, 2, size=10) 
array([ 1, 1, -1, 0, 0, -1, 1, 0, -1, -1]) 
+6

¿Tiene alguna justificación para su recomendación? ¿Qué pasa con 'numpy.random.seed()'? Sé que no es seguro para subprocesos, pero es muy conveniente si no necesitas seguridad de subprocesos. –

+36

Se trata principalmente de formar buenos hábitos. Es posible que no necesite flujos independientes ahora, pero Sven-6-months-from-now podría hacerlo. Si escribe sus bibliotecas para usar los métodos directamente de 'numpy.random', no podrá hacer transmisiones independientes más adelante. También es más fácil escribir bibliotecas con la intención de tener transmisiones controladas de PRNG. Siempre hay múltiples formas de ingresar a su biblioteca, y cada una de ellas debe tener una forma de controlar la semilla. Pasar por los objetos de PRNG es una forma más limpia de hacerlo que confiar en 'numpy.random.seed()'.Lamentablemente, este cuadro de comentarios es demasiado corto para contener más ejemplos. :-) –

+0

Gracias por la respuesta. Están planteando buenos puntos, y al pensarlo un poco, estoy de acuerdo en que esto es más limpio. Sigo pensando que para los propósitos de las pruebas de OP 'numpy.random.seed()' debería estar bien, pero editaré 'numpy.random.seed()' fuera de mi propio código de biblioteca :) –

1

Si está utilizando otras funciones que dependen de un estado aleatorio, puede no sólo ajustar y semillas en general, pero en su lugar debe crear una función para generar su lista aleatoria de número y establecer la semilla como un parámetro de la función. Esto no va a molestar al resto de generadores aleatorios en el código:

# Random states 
def get_states(random_state, low, high, size): 
    rs = np.random.RandomState(random_state) 
    states = rs.randint(low=low, high=high, size=size) 
    return states 

# Call function 
states = get_states(random_state=42, low=2, high=28347, size=25)