2大模塊+20個函數,完美詮釋Python隨機過程~ 一、random模塊 np.random模塊

公衆號:尤而小屋
作者:Peter
編輯:Peter

大家好,我是Peter~

本文詳細地介紹基於Python的第三方庫random和numpy.random模塊進行隨機生成數據和隨機採樣的過程。

導入庫

import random
import numpy as np
import pandas as pd

一、random模塊

Python中的random模塊實現了各種分佈的僞隨機數生成器。

random.random()

用於生成一個0到1的隨機符點數: 0 <= n < 1.0

我們可以模仿多次,每次生成的結果是不同的:

random.random()
0.47917938679860983
random.random()
0.5609907030373721

random.uniform()

返回一個隨機的浮點數

random.uniform(1,10)
6.001485472959377

同樣的改變區間,每次生成不同的數據:

random.uniform(2,5)
3.9644214464183154

random.randint()

返回的是一個隨機整數;重複操作生成不同的數據:

random.randint(1,10)
7
random.randint(2,7)
3

random.randrange()

random.randrange([start], stop[, step])

返回的結果就是一個數值

random.randrange(10)  # 默認起始值是0
1
random.randrange(1,10)  # 指定頭尾
7
random.randrange(1,10,2)  # 指定步長
1
random.randrange(-6,-1)  # 範圍爲負數
-2

random.choices()

針對序列進行隨機取數的一個函數

random.choices(sequence, weights=None, cum_weights=None, k=1)
  • sequence:待抽取的序列;list,tuple,字符串等
  • weights:列表是可以權衡每個值的可能性,可選
  • cum_weights:列表是可以權衡每個值的可能性,只有這一次累積的可能性
  • k:可選。一個定義返回列表長度的整數

來自中文官網的解釋:https://docs.python.org/zh-cn/3/library/random.html

如果指定了 weight 序列,則根據相對權重進行選擇。 或者,如果給出 cum_weights 序列,則根據累積權重(可能使用 itertools.accumulate() 計算)進行選擇。

例如,相對權重[10, 5, 30, 5]相當於累積權重[10, 15, 45, 50]。 在內部,相對權重在進行選擇之前會轉換爲累積權重,因此提供累積權重可以節省工作量。

1、針對列表的隨機取數

# 1、列表
names = ["Mike","Tom","Peter","Jimmy"]
random.choices(names)
['Tom']
random.choices(names)
['Mike']
random.choices(names)
['Jimmy']

2、針對元組的隨機取數:

# 2、元組
fruits = ("蘋果","梨","葡萄","香蕉")
random.choices(fruits)
['梨']
random.choices(fruits)
['梨']
random.choices(fruits)
['葡萄']

3、針對字符串的隨機取數:

# 3、字符串
address = "abcdefg"
random.choices(address)
['g']

重複操作返回不同的數據:

random.choices(address)
['a']

random.choice()

從序列中隨機選取一個數據,返回的是一個字符,而不是列表

random.choice(names)  # choice
'Mike'
random.choice(fruits)  # choice
'蘋果'
random.choice(address)  # choice
'a'

要注意random.choices返回的是列表:

random.choices(address)  # choices:返回列表
['g']

random.shuffle()

將一個列表(只針對列表)中的數據隨機打亂

names  # 打亂前
['Mike', 'Tom', 'Peter', 'Jimmy']
random.shuffle(names)
names  # 打亂後
['Tom', 'Peter', 'Mike', 'Jimmy']

random.sample()

random.sample的函數原型爲:random.sample(sequence, k)

從指定序列中隨機獲取指定長度的片斷,sample函數不會修改原有序列。

用於無重複的隨機抽樣

number = [1,2,3,4,5,6,7,8,9,10]

# 從中隨機選擇6個數據
random.sample(number, 6)
[9, 6, 7, 4, 8, 3]
number  # 原數據是不變的
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

random.seed

random.seed(a, version):自定義隨機數生成器的起始編號,保證每次運行的結果是相同的。就是我們通常理解的設置隨機種子

同樣的種子下操作3次,結果是相同的:

random.seed(3)
random.random()
0.23796462709189137
random.seed(3)
random.random()
0.23796462709189137
random.seed(3)
random.random()
0.23796462709189137

np.random模塊

在numpy中同樣也有一個random能夠用於生成各種隨機數據,同時也能夠用於數據的隨機採樣

np.random.rand()

生成指定維度的的[0,1)範圍之間的隨機數,輸入參數爲維度

np.random.rand(3)  # 一維
array([0.56316478, 0.19472655, 0.77416481])
np.random.rand(3,2)  # 二維
array([[0.53948953, 0.28900922],
       [0.50819889, 0.87661466],
       [0.6275246 , 0.50510408]])
np.random.rand(3,2,2)  # 三維
array([[[0.07652093, 0.08418762],
        [0.26209203, 0.62653792]],

       [[0.35453925, 0.79562255],
        [0.38392161, 0.13594379]],

       [[0.76627042, 0.46727042],
        [0.71653905, 0.36350333]]])

random.randint()

具體語法爲:

random.randint(low, high=None, size=None, dtype=int)
np.random.randint(10)  # 指定low
1
np.random.randint(2, 100)  # 指定low和high
2
np.random.randint(2,100,size=5)  # 指定size
array([45, 45, 17, 78, 72])
np.random.randint(2,100,5)  # 指定size
array([13, 61,  9, 77, 25])
np.random.randint(2,100,size=(5,3))  # 指定多維度size
array([[89,  4, 94],
       [96, 26, 76],
       [71,  2, 78],
       [26, 79, 68],
       [30, 85, 94]])

np.random.randn()

生成指定維度的服從標準正態分佈的隨機數,輸入參數爲維度

np.random.randn(3)  # 一維
array([ 0.86231343, -0.17504608, -1.18435821])
np.random.randn(2, 4)  # 二維
array([[ 0.6815724 , -0.40425239, -0.70292058,  1.50423829],
       [ 1.39392811,  1.21985809, -0.13557424,  0.01812161]])

np.random.random_integers()

返回範圍爲[low,high] 閉區間 隨機整數;可放回的抽樣取數

np.random.random_integers(2,size=5)
array([1, 1, 2, 1, 1])
np.random.random_integers(1,6,size=5)
array([5, 3, 5, 1, 1])
np.random.random_integers(1,6,size=8)
array([4, 2, 4, 2, 4, 3, 5, 6])

np.random.random()

返回0-1之間指定維度下的隨機數

np.random.random(size=None)
np.random.random()
0.5446614807473444
np.random.random(size=(2,3))
array([[0.24849247, 0.24794785, 0.12318699],
       [0.38708798, 0.12982558, 0.67378513]])
np.random.random(size=(2,3,4))
array([[[0.34112893, 0.19507699, 0.0998322 , 0.1613075 ],
        [0.14750045, 0.64746506, 0.37992539, 0.96126298],
        [0.4169575 , 0.21279002, 0.84499108, 0.46106979]],

       [[0.35969999, 0.83434346, 0.435845  , 0.22377047],
        [0.49878421, 0.7140939 , 0.19513683, 0.90309624],
        [0.84402436, 0.94049321, 0.44680034, 0.12482742]]])

np.random.seed()

設置隨機種子,保證每次的結果相同

np.random.seed(20)
np.random.random()
0.5881308010772742
np.random.seed(20)
np.random.random()
0.5881308010772742
np.random.seed(20)
np.random.random()
0.5881308010772742

np.random.choice()

從序列中隨機選擇數據,放回或者不放回可指定

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

p可以指定a中每個元素被選擇的概率

# 等價於: np.random.randint(0,5,3)
np.random.choice(5, 3)
array([4, 2, 1])

下面通過一個詳細的例子來說明各個參數的使用

numbers = [1,2,3,4,5,6,7,8,9,10]
np.random.choice(numbers)  # 抽一個數據
5
np.random.choice(numbers,size=5)  # 一維抽樣
array([7, 8, 3, 1, 7])
np.random.choice(numbers,size=(2,4))  # 二維抽樣
array([[ 9,  6,  4,  1],
       [ 7,  7,  1, 10]])

在無放回抽樣中,取出來的數據是沒有重複的:

# 無放回抽樣
np.random.choice(
    numbers,
    size=5,
    replace=False  # 不放回
)
array([1, 5, 2, 9, 4])

還可以指定每個元素被抽取的概率,p中所有元素的和爲1,且個數必須爲待抽取的序列中的個數相同:

np.random.choice([1,2,3,4,5],
                 size=3, 
                 p=[0.2,0.2,0.1,0.2,0.3])
array([2, 2, 5])

np.random.standard_normal()

標準正態分佈隨機取數,就一個可選參數size,用來指定維度

np.random.standard_normal()
-2.098773908831827
np.random.standard_normal(10)
array([-1.85559768,  0.55097131, -0.36372358, -0.99642606, -1.1653022 ,
        1.30970062,  0.32287203,  0.64708367, -0.49947789, -0.38030095])
np.random.standard_normal(size=(3,2))
array([[ 1.60136877, -0.21666908],
       [-0.76330235,  1.4667905 ],
       [-0.45362263,  0.65496734]])

np.random.random_sample()

用於生成0-1之間的隨機浮點數或者數組

np.random.random_sample()
0.29533501415054364
np.random.random_sample(size=(3,2))
array([[0.32882246, 0.26813417],
       [0.13655489, 0.37195498],
       [0.01574185, 0.34472747]])

np.random.shuffle()

對給定的數據進行重排序,如果數據爲爲多維數組,只沿第一條軸洗牌

names
['Tom', 'Peter', 'Mike', 'Jimmy']
np.random.shuffle(names)  # 第一次洗牌
names
['Peter', 'Tom', 'Mike', 'Jimmy']
np.random.shuffle(names)  # 第二次洗牌
names
['Tom', 'Jimmy', 'Mike', 'Peter']

當給定的數據是多維度的,該如何處理?

# 如果數據是多維度
data = np.random.random_sample(size=(3,2))
data
array([[0.64656729, 0.42563648],
       [0.51356833, 0.50125784],
       [0.03708381, 0.7081161 ]])
np.random.shuffle(data)  
data
array([[0.51356833, 0.50125784],
       [0.03708381, 0.7081161 ],
       [0.64656729, 0.42563648]])

np.random.permutation()

同樣也是洗牌的過程,只是不會打亂原數據的順序

names
['Tom', 'Jimmy', 'Mike', 'Peter']

permutation()沒有改變names的順序:

np.random.permutation(names)
array(['Peter', 'Jimmy', 'Mike', 'Tom'], dtype='<U5')
names
['Tom', 'Jimmy', 'Mike', 'Peter']

下面執行shuffle操作,已經改變了順序:

np.random.shuffle(names)
names
['Tom', 'Peter', 'Jimmy', 'Mike']
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章