2011-04-29 14 views
68

Czekam innego autora, aby zakończyć część kodu, który zwraca tablicę NP kształtu (100,2000) o wartości którejkolwiek -1,0 lub 1.Niezmiennie tworzyć sam losowy numpy tablicy

W międzyczasie chcę utworzyć losowo tablicę o tych samych właściwościach, dzięki czemu mogę zacząć od rozwoju i testowania. Chodzi o to, że chcę, aby ta losowo utworzona tablica była taka sama za każdym razem, więc nie testowałem przeciwko tablicy, która zmienia jej wartość za każdym razem, gdy ponownie uruchamiam mój proces.

Mogę utworzyć moją tablicę w ten sposób, ale czy istnieje sposób jej utworzenia, aby za każdym razem była taka sama. Mogę podnieść obiekt i rozpruć go, ale zastanawiam się, czy istnieje inny sposób.

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

Odpowiedz

71

Po prostu prześlij generator liczb losowych o ustalonej wartości, np.

numpy.random.seed(42) 

W ten sposób zawsze otrzymasz tę samą sekwencję liczb losowych.

+0

o wiele lepiej niż marynowanie i rozpakowywanie. dzięki Sven – Idr

+30

Ktoś zakradł się do funkcji 'numpy.random.seed()', gdy nie zwracałem na nią uwagi. :-) Celowo opuściłem go z oryginalnego modułu. Polecam ludziom używanie własnych instancji 'RandomState' i przekazywanie tych obiektów. –

+5

Robert jest głównym źródłem numpy. Myślę, że powinniśmy wyrazić jego opinię. – deprecated

140

Utwórz własne wystąpienie numpy.random.RandomState() z wybranym nasionem. Nie używaj kodu numpy.random.seed(), z wyjątkiem pracy z nieelastycznymi bibliotekami, które nie pozwalają omijać własnej instancji 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

Czy masz jakieś uzasadnienie swojej rekomendacji? Co jest nie tak z 'numpy.random.seed()'? Wiem, że nie jest to bezpieczne dla wątków, ale jest to wygodne, jeśli nie potrzebujesz bezpieczeństwa wątków. –

+36

Chodzi głównie o dobre nawyki. Możesz nie potrzebować teraz niezależnych strumieni, ale Sven-6 miesięcy od teraz może. Jeśli napiszesz swoje biblioteki, aby korzystać z metod bezpośrednio z 'numpy.random', nie będziesz mógł później tworzyć niezależnych strumieni. Łatwiej też pisać biblioteki z zamiarem kontrolowania strumieni PRNG. Zawsze jest wiele sposobów na wejście do biblioteki, a każdy z nich powinien mieć sposób kontrolowania nasienia. Przechodzenie wokół obiektów PRNG jest czystszym sposobem na to, niż poleganie na 'numpy.random.seed()'.Niestety, to pole komentarza jest zbyt krótkie, by zawierało więcej przykładów :-) –

+0

Dzięki za odpowiedź. Podnosisz dobre strony i myślę o tym trochę, zgadzam się, że jest to czystsze. Nadal uważam, że dla celów testowania OP 'numpy.random.seed()' powinno być w porządku, ale zmienię 'numpy.random.seed()' z mojego własnego kodu biblioteki :) –

1

Jeśli używasz innych funkcji, powołując się na stan losowej, nie można po prostu ustawić i ogólnie nasion, ale powinno zamiast utworzyć funkcję wygenerować losowy numer listy i ustaw nasienia jako parametr funkcja. Nie będzie to przeszkadzać innym generatorom losowym w kodzie:

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