首頁 > 軟體

Python NumPy隨機抽模組介紹及方法

2022-09-06 18:06:11

1. 亂數

np.random.random()是最常用的亂數生成函數,該函數生成的亂數隨機均勻分佈於[0, 1)區間。如果不提供引數,np.random.random()函數返回一個浮點型亂數。np.random.random()函數還可以接受一個整型或元組引數,用於指定返回的浮點型亂數陣列的結構(shape)。也有很多人習慣使用np.random.rand()函數生成亂數,其功能和np.random.random()函數一樣,知識np.random.rand()函數不接受元組引數,必須要寫成兩個整型引數

import numpy as np

print(np.random.random())
print(np.random.random(2))
print(np.random.random((2,3)))

np.random.randint()是另一個常用的亂數生成函數,該函數生成的隨機整數均勻分佈於[low, high)區間。如果省略low引數,則預設low的值等於0。np.random.randint()函數還有一個預設引數size,用於指定返回的整型亂數陣列的結構(shape)

print(np.random.randint(10))
print(np.random.randint(10, size=5))
print(np.random.randint(10, size=(2,5)))
print(np.random.randint(10, 100, size=(2,5)))

2. 隨機抽樣

隨機抽樣是從指定的有序列表中隨機抽取指定數量的元素。隨機抽樣的應用比較廣泛,如產品抽檢、抽籤順序等。NumPy的隨機抽樣函數是np.random.choice(),其原型如下

np.random.choice(a, size=None, replace=True, p=None)

引數a表示待抽樣的全體樣本,它值接受整數或一維的陣列(列表)。引數a如果是整數,相當於將陣列np.arange(a)作為全體樣本。引數size用於指定返回抽樣結果陣列的結構(shape)。引數replace用於指定是否允許多次抽取同一個樣本,預設為允許。引數p是和全體樣本集合等長的權重陣列,用於指定對應樣本被抽中的概率。

import numpy as np

print(np.random.choice(1,5)) # 抽籤樣本只有1個元素0,抽取5次
print(np.random.choice(['a','b','c'], size=(3,5), p=[0.5,0.25,0.25])) # 指定權重
print(np.random.choice(np.arange(100), size=(2,5), replace=False)) # 不允許重複

3. 正態分佈

使用np.random.randn()函數是最簡單的生成標準正態分佈亂數的方法。np.random.randn()函數用於生成均值為0、標準差為1的正態分佈(標準正態分佈)的亂數、該函數可以接受一個或兩個整型引數,用來指定返回的符合標準正態分佈的亂數陣列的結構(shape)

import numpy as np

print(np.random.randn()) # 標準正態分佈,均值為0,標準差為1
print(np.random.randn(5))
print(np.random.randn(2,5))

如果需要生成非標準正態分佈亂數,則應該使用np.random.normal()函數。np.random.nomal()函數預設生成均值為0、標準差為1的正態分佈亂數。引數loc用於指定均值,引數scale用於指定標準差,引數size用於指定返回的符合正態分佈的亂數陣列的結構(shape)。從下面的程式碼可以看出,和使用預設標準差相比,指定標準差為0.2時,資料分佈更加靠近均值

print(np.random.normal()) # 預設均值為0,標準差為1
print(np.random.normal(loc=2, size=5)) # 引數loc指定均值為2
print(np.random.normal(loc=2, scale=0.2, size=(2,5))) # 引數loc指定均值為2,引數scale指定標準差為0.2

4. 偽亂數的深度思考

計算機程式或程式語言中的亂數都是偽亂數。因為計算機硬體是確定的,程式碼是固定的,演演算法是準確的,通過這些確定的、固定的、準確的東西不會產生真正的亂數,除非引入這個封閉系統以外的因素。計算機系統的隨機演演算法一般使用線性同餘或平方取中的演演算法,通過一個種子(通常用時鐘代替)產生。這意味著,如果知道了種子和已經產生的亂數,就可能獲得接下來亂數序列的資訊,這就是偽亂數的可預測性

NumPy亂數函數內部使用了一個偽亂數生成器,這個生成器每次範例化時都需要一個種子(整數)完成初始化。如果兩次初始化的種子相同,則每次初始化後產生的亂數序列就完全一致。np.random.seed()函數可以指定偽亂數生成器的初始化種子

import numpy as np

np.random.seed(12345) # 使用'12345'隨機種子初始化偽亂數生成器
print(np.random.random(5))
print(np.random.random((2,3)))

np.random.seed(12345) # 再次使用'12345'隨機種子初始化偽亂數生成器
print(np.random.random(5)) # 和上面完全一致
print(np.random.random((2,3))) # 和上面完全一致

從上述程式碼彙總可以看出,只要指定相同的種子,接下來的隨機序列就完全一致。這意味著,只有從外部引入真正的隨機因子(如天空雲朵的形狀、鄰居家無線網路訊號的強度等)作為種子,才可以得到真正的亂數

此外,NumPy還提供了亂數生成器,可以直接操作這個生成器來生成亂數

r = np.random.RandomState(12345) # 使用亂數生成器也同樣
print(r.random(5)) # 和上面完全一致
print(r.random((2,3))) # 和上面完全一致

到此這篇關於Python NumPy隨機抽模組介紹及方法的文章就介紹到這了,更多相關Python NumPy 內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com