2011-04-29 28 views
68

Sono in attesa di un altro sviluppatore per finire un pezzo di codice che restituirà una serie np di forma (100,2000) con valori di entrambi -1,0, oppure 1.creare Consistenly stessa casuale gamma NumPy

Nel frattempo, voglio creare in modo casuale un array con le stesse caratteristiche, così posso ottenere un vantaggio sui miei sviluppi e test. Il fatto è che voglio che questa matrice creata a caso sia sempre la stessa, quindi non sto testando una matrice che continua a cambiare il suo valore ogni volta che rieseguo il mio processo.

Posso creare il mio array in questo modo, ma c'è un modo per crearlo in modo che sia sempre lo stesso. Posso mettere sott'aceto l'oggetto e annullarlo, ma mi chiedo se c'è un altro modo.

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

risposta

71

Seme semplicemente il generatore di numeri casuali con un valore fisso, ad es.

numpy.random.seed(42) 

In questo modo, otterrete sempre la stessa sequenza di numeri casuali.

+0

molto meglio di decapaggio e disgiunzione. grazie Sven – Idr

+30

Qualcuno si è intrufolato nella funzione 'numpy.random.seed()' quando non stavo prestando attenzione. :-) L'ho intenzionalmente lasciato fuori dal modulo originale. Raccomando che le persone usino le proprie istanze di 'RandomState' e passino quegli oggetti in giro. –

+5

Robert è uno dei principali contributori di numpy. Penso che dovremmo dare un po 'di peso alla sua opinione. – deprecated

140

Crea la tua istanza di numpy.random.RandomState() con il seme selezionato. Non utilizzare numpy.random.seed() eccetto per aggirare le librerie inflessibili che non consentono di aggirare la propria istanza 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

Hai qualche motivazione per la tua raccomandazione? Cosa c'è di sbagliato in 'numpy.random.seed()'? So che non è thread-safe, ma è davvero comodo se non hai bisogno di thread-safety. –

+36

Principalmente è per formare buone abitudini. Potresti non aver bisogno di flussi indipendenti ora, ma potrebbe farlo Sven-6-months-from-now. Se scrivi le tue librerie per usare i metodi direttamente da 'numpy.random', non puoi creare flussi indipendenti in seguito. È anche più facile scrivere librerie con l'intenzione di controllare i flussi PRNG. Ci sono sempre diversi modi per accedere alla tua libreria e ognuno di essi dovrebbe avere un modo per controllare il seme. Passare attorno agli oggetti PRNG è un modo più semplice per farlo, piuttosto che fare affidamento su 'numpy.random.seed()'.Sfortunatamente, questa casella di commento è troppo corta per contenere altri esempi. :-) –

+0

Grazie per la risposta. Stai sollevando buoni punti e, ripensandoci un po ', sono d'accordo che è più pulito. Continuo a pensare per gli scopi di test dell'OP 'numpy.random.seed()' dovrebbe andare bene, ma modificheremo 'numpy.random.seed()' dal mio codice libreria :) –

1

Se si utilizzano altre funzioni basandosi su uno stato casuale, è possibile non solo impostare e seme nel complesso, ma necessario creare invece una funzione per generare la vostra lista casuale di numero e impostare il seme come parametro di la funzione. Questo non disturberà altri generatori casuali nel codice:

# 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) 
Problemi correlati