隨機 Generator
#
Generator
(生成器) 提供對各種分佈的存取,並作為 RandomState
(隨機狀態) 的替代品。兩者之間的主要區別在於 Generator
依賴額外的 BitGenerator (位元生成器) 來管理狀態和生成隨機位元,然後將其轉換為來自有用分佈的隨機值。Generator
使用的預設 BitGenerator 是 PCG64
。可以透過將實例化的 BitGenerator 傳遞給 Generator
來更改 BitGenerator。
- numpy.random.default_rng(seed=None)#
使用預設 BitGenerator (PCG64) 建構新的 Generator (生成器)。
- 參數:
- seed{None, int, array_like[ints], SeedSequence, BitGenerator, Generator, RandomState},可選
用於初始化
BitGenerator
的種子。如果為 None,則會從作業系統中提取新的、不可預測的熵。如果傳遞int
或array_like[ints]
,則所有值都必須是非負數,並將傳遞給SeedSequence
以衍生初始BitGenerator
狀態。也可以傳入SeedSequence
實例。此外,當傳遞BitGenerator
時,它將被Generator
包裝。如果傳遞Generator
,它將保持不變地返回。當傳遞舊版RandomState
實例時,它將被強制轉換為Generator
。
- 返回:
- Generator (生成器)
已初始化的生成器物件。
註解
如果
seed
不是BitGenerator
或Generator
,則會實例化新的BitGenerator
。此函數不管理預設的全域實例。有關種子的更多資訊,請參閱 播種和熵。
範例
default_rng
是隨機數類別Generator
的建議建構子。以下是我們可以使用default_rng
和Generator
類別建構隨機數生成器的幾種方式。在這裡,我們使用
default_rng
生成一個隨機浮點數>>> import numpy as np >>> rng = np.random.default_rng(12345) >>> print(rng) Generator(PCG64) >>> rfloat = rng.random() >>> rfloat 0.22733602246716966 >>> type(rfloat) <class 'float'>
在這裡,我們使用
default_rng
生成 3 個介於 0 (包含) 和 10 (排除) 之間的隨機整數>>> import numpy as np >>> rng = np.random.default_rng(12345) >>> rints = rng.integers(low=0, high=10, size=3) >>> rints array([6, 2, 7]) >>> type(rints[0]) <class 'numpy.int64'>
在這裡,我們指定一個種子,以便我們獲得可重現的結果
>>> import numpy as np >>> rng = np.random.default_rng(seed=42) >>> print(rng) Generator(PCG64) >>> arr1 = rng.random((3, 3)) >>> arr1 array([[0.77395605, 0.43887844, 0.85859792], [0.69736803, 0.09417735, 0.97562235], [0.7611397 , 0.78606431, 0.12811363]])
如果我們退出並重新啟動 Python 解譯器,我們將看到我們再次生成相同的隨機數
>>> import numpy as np >>> rng = np.random.default_rng(seed=42) >>> arr2 = rng.random((3, 3)) >>> arr2 array([[0.77395605, 0.43887844, 0.85859792], [0.69736803, 0.09417735, 0.97562235], [0.7611397 , 0.78606431, 0.12811363]])
- class numpy.random.Generator(bit_generator)#
BitGenerators 的容器。
Generator
(生成器) 公開了許多用於生成從各種機率分佈中抽取的隨機數的方法。除了特定於分佈的參數之外,每種方法都接受一個關鍵字參數 size,其預設值為None
。如果 size 為None
,則會生成並返回單個值。如果 size 是整數,則會返回填充了生成值的 1-D 陣列。如果 size 是元組,則會填充並返回具有該形狀的陣列。函數
numpy.random.default_rng
將使用 NumPy 的預設BitGenerator
(位元生成器) 實例化Generator
(生成器)。不保證相容性
Generator
(生成器) 不提供版本相容性保證。特別是,隨著更好的演算法演進,位元流可能會更改。- 參數:
- bit_generatorBitGenerator (位元生成器)
用作核心生成器的 BitGenerator。
另請參閱
default_rng
Generator
(生成器) 的建議建構子。
註解
Python stdlib 模組
random
包含偽隨機數生成器,其許多方法與Generator
(生成器) 中可用的方法類似。它使用 Mersenne Twister,並且可以使用MT19937
存取此位元生成器。Generator
除了感知 NumPy 外,還具有提供更多可供選擇的機率分佈的優勢。範例
>>> from numpy.random import Generator, PCG64 >>> rng = Generator(PCG64()) >>> rng.standard_normal() -0.203 # random
存取 BitGenerator 和衍生#
取得生成器使用的位元生成器實例 |
|
|
建立新的獨立子生成器。 |
簡單隨機資料#
排列#
隨機排列序列的方法為
|
透過洗牌其內容來就地修改陣列或序列。 |
|
隨機排列序列,或返回排列後的範圍。 |
|
沿著軸 axis 隨機排列 x。 |
下表總結了這些方法的行為。
方法 |
複製/就地 |
軸處理 |
---|---|---|
shuffle (洗牌) |
就地 |
如同 1d |
permutation (排列) |
複製 |
如同 1d |
permuted (已排列) |
任一 (使用 'out' 進行就地操作) |
軸獨立 |
以下小節提供了有關差異的更多詳細資訊。
就地操作與複製#
Generator.shuffle
和 Generator.permutation
之間的主要區別在於 Generator.shuffle
就地操作,而 Generator.permutation
返回副本。
預設情況下,Generator.permuted
返回副本。若要使用 Generator.permuted
進行就地操作,請將相同的陣列作為第一個參數和作為 out
參數的值傳遞。例如,
>>> import numpy as np >>> rng = np.random.default_rng() >>> x = np.arange(0, 15).reshape(3, 5) >>> x array([[ 0, 1, 2, 3, 4], [ 5, 6, 7, 8, 9], [10, 11, 12, 13, 14]]) >>> y = rng.permuted(x, axis=1, out=x) >>> x array([[ 1, 0, 2, 4, 3], # random [ 6, 7, 8, 9, 5], [10, 14, 11, 13, 12]])請注意,當給定
out
時,傳回值為out
>>> y is x True
處理 axis
參數#
這些方法的一個重要區別是如何處理 axis
參數。Generator.shuffle
和 Generator.permutation
都將輸入視為一維序列,並且 axis
參數決定將輸入陣列的哪個維度用作序列。在二維陣列的情況下,axis=0
實際上會重新排列陣列的行,而 axis=1
會重新排列列。例如
>>> import numpy as np
>>> rng = np.random.default_rng()
>>> x = np.arange(0, 15).reshape(3, 5)
>>> x
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
>>> rng.permutation(x, axis=1)
array([[ 1, 3, 2, 0, 4], # random
[ 6, 8, 7, 5, 9],
[11, 13, 12, 10, 14]])
請注意,列已「批量」重新排列:每列中的值未更改。
方法 Generator.permuted
處理 axis
參數的方式與 numpy.sort
處理它的方式類似。沿著給定軸的每個切片都獨立於其他切片進行洗牌。將以下 Generator.permuted
的使用範例與上面的 Generator.permutation
範例進行比較
>>> import numpy as np
>>> rng = np.random.default_rng()
>>> rng.permuted(x, axis=1)
array([[ 1, 0, 2, 4, 3], # random
[ 5, 7, 6, 9, 8],
[10, 14, 12, 13, 11]])
在此範例中,每行中的值 (即沿著 axis=1
的值) 已獨立洗牌。這不是列的「批量」洗牌。
洗牌非 NumPy 序列#
Generator.shuffle
適用於非 NumPy 序列。也就是說,如果給它一個不是 NumPy 陣列的序列,它會就地洗牌該序列。
>>> import numpy as np
>>> rng = np.random.default_rng()
>>> a = ['A', 'B', 'C', 'D', 'E']
>>> rng.shuffle(a) # shuffle the list in-place
>>> a
['B', 'D', 'A', 'E', 'C'] # random
分佈#
|
從 Beta 分佈中抽取樣本。 |
|
從二項式分佈中抽取樣本。 |
|
從卡方分佈中抽取樣本。 |
|
從狄利克雷分佈中抽取樣本。 |
|
從指數分佈中抽取樣本。 |
|
從 F 分佈中抽取樣本。 |
|
從 Gamma 分佈中抽取樣本。 |
|
從幾何分佈中抽取樣本。 |
|
從耿貝爾分佈中抽取樣本。 |
|
從超幾何分佈中抽取樣本。 |
|
從具有指定位置 (或平均值) 和尺度 (衰減) 的拉普拉斯或雙指數分佈中抽取樣本。 |
|
從邏輯斯諦分佈中抽取樣本。 |
|
從對數常態分佈中抽取樣本。 |
|
從對數級數分佈中抽取樣本。 |
|
從多項式分佈中抽取樣本。 |
|
從多變量超幾何分佈生成變量。 |
|
從多變量常態分佈中抽取隨機樣本。 |
|
從負二項式分佈中抽取樣本。 |
|
從非中心卡方分佈中抽取樣本。 |
|
從非中心 F 分佈中抽取樣本。 |
|
從常態 (高斯) 分佈中抽取隨機樣本。 |
|
從具有指定形狀的帕雷托 II (又名 Lomax) 分佈中抽取樣本。 |
|
從 Poisson 分佈中抽取樣本。 |
|
從具有正指數 a - 1 的冪分佈中抽取 [0, 1] 中的樣本。 |
|
從雷利分佈中抽取樣本。 |
|
從模式 = 0 的標準柯西分佈中抽取樣本。 |
|
從標準指數分佈中抽取樣本。 |
|
從標準 Gamma 分佈中抽取樣本。 |
|
從標準常態分佈 (平均值=0,標準差=1) 中抽取樣本。 |
|
從具有 df 自由度的標準學生 t 分佈中抽取樣本。 |
|
從區間 |
|
從均勻分佈中抽取樣本。 |
|
從馮·米塞斯分佈中抽取樣本。 |
|
從瓦爾德或逆高斯分佈中抽取樣本。 |
|
從威布爾分佈中抽取樣本。 |
|
從齊夫分佈中抽取樣本。 |