[英]Modules and numpy.random seeds
我有兩個模塊,第一個是:
# module.py
import numpy
import myrandom
class A():
def __init__(self,n1,n2):
A.rng_set1 = myrandom.generate_random(n1)
A.rng_set2 = myrandom.generate_random(n2)
A.data = np.concatenate((A.rng_set1,A.rng_set2))
模塊myrandom
類似於:
# myrandom.py
import numpy as np
def generate_random(n):
return np.random.rand(n)
給定一個種子,我希望A.data
是可預測的。 如果n1
等於n2
我不希望rng_set1
和rng_set2
共享相同的數字。 我不明白如何播種這個東西。
我試過將np.random.seed(constant)
放入generate_random
,放入A
的 init ,在module.py
頂層和import module.py
之前。 我似乎無法得到想要的結果。
我該怎么做? 謝謝你。
編輯:
我的疏忽導致了不可預測的行為。 請看下面的回答。
您可以將myrandom.py
更改為:
# myrandom.py
import numpy as np
def generate_random(n):
np.random.seed(n)
return np.random.rand(n)
這使seed
可復制並更改不同輸入的輸出。
更好的:
def generate_random(n):
rng = np.random.default_rng(seed=n)
return rng.random.rand(n)
基於 numpy 文檔numpy.random.rand()
是一個遺留函數。 Numpy 建議用種子構建一個生成器,它可以用來確定性地生成數字。 作為一個方便的函數, numpy.random.default_rng()
可以用來創建簡單地創建一個生成器:
from numpy import random
# seed can be a number that will ensure deterministic behaviour
generator_1 = random.default_rng(seed=1)
generator_1.integers(10, size=10)
# array([4, 5, 7, 9, 0, 1, 8, 9, 2, 3])
generator_2 = random.default_rng(seed=1)
generator_2.integers(10, size=10)
# array([4, 5, 7, 9, 0, 1, 8, 9, 2, 3])
這里有一個疏忽。 我遇到的不可預測的行為是由於混合了numpy.random
和 python 的random
庫。 由於只有numpy.random
內行事generate_random
當預期的行為結果np.random.seed()
導入之前被稱為module
或在頂層module
或myrandom
。 感謝所有朋友的時間和幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.