隨機 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,則會從作業系統中提取新的、不可預測的熵。如果傳遞 intarray_like[ints],則所有值都必須是非負數,並將傳遞給 SeedSequence 以衍生初始 BitGenerator 狀態。也可以傳入 SeedSequence 實例。此外,當傳遞 BitGenerator 時,它將被 Generator 包裝。如果傳遞 Generator,它將保持不變地返回。當傳遞舊版 RandomState 實例時,它將被強制轉換為 Generator

返回:
Generator (生成器)

已初始化的生成器物件。

註解

如果 seed 不是 BitGeneratorGenerator,則會實例化新的 BitGenerator。此函數不管理預設的全域實例。

有關種子的更多資訊,請參閱 播種和熵

範例

default_rng 是隨機數類別 Generator 的建議建構子。以下是我們可以使用 default_rngGenerator 類別建構隨機數生成器的幾種方式。

在這裡,我們使用 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。如果 sizeNone,則會生成並返回單個值。如果 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 和衍生#

bit_generator

取得生成器使用的位元生成器實例

spawn(n_children)

建立新的獨立子生成器。

簡單隨機資料#

integers(low[, high, size, dtype, endpoint])

low (包含) 到 high (排除) 返回隨機整數,或者如果 endpoint=True,則從 low (包含) 到 high (包含)。

random([size, dtype, out])

在半開區間 [0.0, 1.0) 中返回隨機浮點數。

choice(a[, size, replace, p, axis, shuffle])

從給定陣列生成隨機樣本

bytes(length)

返回隨機位元組。

排列#

隨機排列序列的方法為

shuffle(x[, axis])

透過洗牌其內容來就地修改陣列或序列。

permutation(x[, axis])

隨機排列序列,或返回排列後的範圍。

permuted(x[, axis, out])

沿著軸 axis 隨機排列 x

下表總結了這些方法的行為。

方法

複製/就地

軸處理

shuffle (洗牌)

就地

如同 1d

permutation (排列)

複製

如同 1d

permuted (已排列)

任一 (使用 'out' 進行就地操作)

軸獨立

以下小節提供了有關差異的更多詳細資訊。

就地操作與複製#

Generator.shuffleGenerator.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.shuffleGenerator.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(a, b[, size])

從 Beta 分佈中抽取樣本。

binomial(n, p[, size])

從二項式分佈中抽取樣本。

chisquare(df[, size])

從卡方分佈中抽取樣本。

dirichlet(alpha[, size])

從狄利克雷分佈中抽取樣本。

exponential([scale, size])

從指數分佈中抽取樣本。

f(dfnum, dfden[, size])

從 F 分佈中抽取樣本。

gamma(shape[, scale, size])

從 Gamma 分佈中抽取樣本。

geometric(p[, size])

從幾何分佈中抽取樣本。

gumbel([loc, scale, size])

從耿貝爾分佈中抽取樣本。

hypergeometric(ngood, nbad, nsample[, size])

從超幾何分佈中抽取樣本。

laplace([loc, scale, size])

從具有指定位置 (或平均值) 和尺度 (衰減) 的拉普拉斯或雙指數分佈中抽取樣本。

logistic([loc, scale, size])

從邏輯斯諦分佈中抽取樣本。

lognormal([mean, sigma, size])

從對數常態分佈中抽取樣本。

logseries(p[, size])

從對數級數分佈中抽取樣本。

multinomial(n, pvals[, size])

從多項式分佈中抽取樣本。

multivariate_hypergeometric(colors, nsample)

從多變量超幾何分佈生成變量。

multivariate_normal(mean, cov[, size, ...])

從多變量常態分佈中抽取隨機樣本。

negative_binomial(n, p[, size])

從負二項式分佈中抽取樣本。

noncentral_chisquare(df, nonc[, size])

從非中心卡方分佈中抽取樣本。

noncentral_f(dfnum, dfden, nonc[, size])

從非中心 F 分佈中抽取樣本。

normal([loc, scale, size])

從常態 (高斯) 分佈中抽取隨機樣本。

pareto(a[, size])

從具有指定形狀的帕雷托 II (又名 Lomax) 分佈中抽取樣本。

poisson([lam, size])

從 Poisson 分佈中抽取樣本。

power(a[, size])

從具有正指數 a - 1 的冪分佈中抽取 [0, 1] 中的樣本。

rayleigh([scale, size])

從雷利分佈中抽取樣本。

standard_cauchy([size])

從模式 = 0 的標準柯西分佈中抽取樣本。

standard_exponential([size, dtype, method, out])

從標準指數分佈中抽取樣本。

standard_gamma(shape[, size, dtype, out])

從標準 Gamma 分佈中抽取樣本。

standard_normal([size, dtype, out])

從標準常態分佈 (平均值=0,標準差=1) 中抽取樣本。

standard_t(df[, size])

從具有 df 自由度的標準學生 t 分佈中抽取樣本。

triangular(left, mode, right[, size])

從區間 [left, right] 上的三角分佈中抽取樣本。

uniform([low, high, size])

從均勻分佈中抽取樣本。

vonmises(mu, kappa[, size])

從馮·米塞斯分佈中抽取樣本。

wald(mean, scale[, size])

從瓦爾德或逆高斯分佈中抽取樣本。

weibull(a[, size])

從威布爾分佈中抽取樣本。

zipf(a[, size])

從齊夫分佈中抽取樣本。