2011-04-29 56 views
68

我在等待另一個顯影劑來完成與任-1,0值的一段代碼,將返回的形狀(100,2000)的NP陣列,或1Consistenly創建相同的隨機numpy的陣列

與此同時,我想隨機創建一個具有相同特徵的數組,這樣我就可以在開發和測試中獲得先機。事情是,我希望隨機創建的數組每次都是相同的,這樣我就不會針對每次重新運行流程時不斷更改其值的數組進行測試。

我可以像這樣創建我的數組,但有沒有創建它的方法,以便每次都是一樣的。我可以醃製物體並取下它,但想知道是否有另一種方法。

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

回答

71

簡單地給隨機數發生器播種一個固定值,例如,

numpy.random.seed(42) 

這樣,你總能得到相同的隨機數字序列。

+0

比酸洗和去除效果好得多。謝謝Sven – Idr 2011-04-29 19:41:21

+30

當我不注意時,有人偷偷在'numpy.random.seed()'函數中。 :-)我故意將它從原始模塊中刪除。我建議人們使用他們自己的RandomState實例並傳遞這些對象。 – 2011-04-29 21:01:49

+5

Robert是numpy的主要貢獻者。我認爲我們應該給他的意見一些重量。 – deprecated 2011-05-01 00:27:53

140

用您選擇的種子創建您自己的numpy.random.RandomState()實例。不要使用numpy.random.seed(),除非要解決不靈活的庫,它們不會讓您傳遞自己的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

你有推薦的理由嗎? 'numpy.random.seed()'有什麼問題?我知道它不是線程安全的,但如果你不需要線程安全,那真的很方便。 – 2011-04-30 19:54:09

+36

這主要是爲了養成良好的習慣。你現在可能不需要獨立的流媒體,但是從現在開始的6個月即可。如果您直接從'numpy.random'編寫庫來使用這些方法,則以後不能再創建獨立的流。編寫庫的目的是控制PRNG流也更容易。總是有多種方式進入你的圖書館,他們每個人都應該有辦法控制種子。傳遞PRNG對象比依靠'numpy.random.seed()'更簡單。不幸的是,這個評論框太短,不能包含更多的例子。:-) – 2011-05-02 19:03:27

+0

感謝您的回覆。你提出了很好的觀點,然後思考了一下,我同意這樣更清潔。我仍然認爲對於OP的測試目的'numpy.random.seed()'應該沒問題,但我會編輯'numpy.random.seed()'出我自己的庫代碼:) – 2011-05-02 21:28:39

1

如果你正在使用其他的功能依靠隨機狀態,你不能只是設置和整體種子,而應該創建一個函數來生成隨機數的列表,並設置種子作爲參數功能。這不會干擾代碼中的任何其他隨機發生器:

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