簡體   English   中英

模塊和 numpy.random 種子

[英]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_set1rng_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或在頂層modulemyrandom 感謝所有朋友的時間和幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM