簡體   English   中英

是否可以更改 NumPy 中隨機生成器的種子?

[英]Is it possible to change the seed of a random generator in NumPy?

假設我實例化了一個隨機生成器

import numpy as np
rng = np.random.default_rng(seed=42)

我想改變它的種子。 是否可以更新生成器的種子而不是用新的種子實例化一個新的生成器?

我設法發現您可以使用rng.__getstate__()看到生成器的 state ,例如在這種情況下它是

{'bit_generator': 'PCG64', 
 'state': {'state': 274674114334540486603088602300644985544, 
 'inc': 332724090758049132448979897138935081983}, 
 'has_uint32': 0, 
 'uinteger': 0}

您可以使用rng.__setstate__更改它,如上面打印的 arguments,但我不清楚如何設置這些 arguments 以便為 rng 的初始 state 提供不同的種子。 是否可以這樣做或實例化一個新的生成器是唯一的方法?

default_rng()這樣的 Numpy 調用會為您提供一個帶有隱式創建的BitGeneratorGenerator 它們之間的區別在於BitGenerator是只知道如何生成統一的uint32 s、 uint64 s 和double s 的低級方法。 然后, Generator可以獲取這些並將它們轉換為其他分布。

正如您所注意到的,您可以使用__getstate__ ,但這是為pickle模塊設計的,而不是真正為您使用它的目的而設計的。

您最好直接訪問bit_generator 這意味着您不需要使用任何 dunder 方法。

以下代碼仍然使用default_rng但這意味着BitGenerator將來可能會發生變化,因此我需要調用type來重新播種。 您最好遵循使用顯式BitGenerator的第二個示例。

import numpy as np

seed = 42

rng = np.random.default_rng()

# get the BitGenerator used by default_rng
BitGen = type(rng.bit_generator)

# use the state from a fresh bit generator
rng.bit_generator.state = BitGen(seed).state

# generate a random float
print(rng.random())

輸出0.7739560485559633 如果您樂於修復BitGenerator ,則可以避免調用type ,例如:

rng = np.random.Generator(np.random.PCG64())

rng.bit_generator.state = np.random.PCG64(seed).state

rng.random()

輸出相同的值。

注意另一個答案 ( https://stackoverflow.com/a/74474377/2954547 ) 更好。 使用那個,而不是這個。


這可能是一個愚蠢的 hack,但一個解決方案是使用所需的新種子創建一個的 RNG 實例,然后將現有 RNG 實例的 state 替換為新實例的 state:

import numpy as np

seed = 12345

rng = np.random.default_rng(seed)
x1 = rng.normal(size=10)

rng.__setstate__(np.random.default_rng(seed).__getstate__())
x2 = rng.normal(size=10)

np.testing.assert_array_equal(x1, x2)

然而,這與僅替換 RNG 實例沒有太大區別。

編輯:為了更直接地回答這個問題,我認為如果不構建新的GeneratorBitGenerator就不可能替換種子,除非您知道如何為Generator中的特定BitGenerator正確構建 state 數據。 創建一個新的 RNG 相當便宜,雖然我理解不實例化一個新的 RNG 在概念上的吸引力,但這里唯一的選擇是在 Numpy 問題跟蹤器或郵件列表上發布功能請求。

暫無
暫無

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

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