NumPy 随机数函数

import numpy as np

生成随机矩阵

$3 \times 2$ 的服从 $[0, 1)$ 均匀分布的矩阵

np.random.rand(3, 2)
array([[0.03586754, 0.17938111],
       [0.28677757, 0.73396444],
       [0.4283936 , 0.11322565]])

如果对均匀分布的参数由要求,可以使用下面的函数生成范围为 $[low, high)$ 的矩阵

np.random.uniform(low=1, high=2, size=(2, 3))
array([[1.3865865 , 1.89435718, 1.35093917],
       [1.55512695, 1.55014588, 1.69716036]])

$2 \times 3$ 的服从标准正态分布矩阵

np.random.randn(2, 3)
array([[-0.48992602,  1.31041614,  0.37765003],
       [-0.41608239,  0.72038314,  0.11513688]])

如果对正态分布的参数有要求,可以使用下面的函数生成均值为 loc、标准差为 scale 的矩阵

np.random.normal(loc=1, scale=1, size=(2, 2))
array([[1.14519121, 1.65683431],
       [1.26922318, 1.55413937]])

产生服从泊松分布的 $3 \times 2$ 矩阵,其中参数 $λ=2$

np.random.poisson(lam=2, size=(3, 2))
array([[3, 1],
       [3, 1],
       [7, 1]])

生成形状为 $2 \times 3$ 的矩阵,其中每个元素的值为 $[1, 10)$ 的随机整数

np.random.randint(low=1, high=10, size=(2, 3))
array([[1, 9, 6],
       [1, 6, 2]])

随机运算与概率模型

初始化随机数种子

np.random.seed(0)
x = np.arange(9).reshape(3, 3)
x
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])

对原矩阵的第 1 维随机排列,并且只能对第 1 维随机排列。

np.random.shuffle(x)
np.random.permutation(x)
array([[0, 1, 2],
       [6, 7, 8],
       [3, 4, 5]])

摸球模型

x 表示球的编号,p 表示摸到各个球的概率。

x = np.array([1, 2, 3, 4])
p = [0.3, 0.2, 0.4, 0.1]

choice 函数模拟摸一次球

np.random.choice(x, p=p)
3

可以不指定概率分布 p,那么摸到每个球的概率是等可能的。

np.random.choice(x)
4

x 中随机抽取 6 个球,排成 $3 \times 2$ 矩阵:

np.random.choice(x, size=(3, 2))
array([[4, 2],
       [4, 2],
       [3, 1]])

可以无放回地抽取,默认是有放回:

np.random.choice(x, size=(3, 1), replace=False)
array([[2],
       [1],
       [3]])

进行伯努利试验,验证频率依概率收敛于概率:

A = np.random.choice(x, size=(100, 100), p=p)
A1 = (A==1).astype(np.int32)  # 将 A 中值为 1 的元素置 1,下同
A2 = (A==2).astype(np.int32)
A3 = (A==3).astype(np.int32)
A4 = (A==4).astype(np.int32)
count1 = np.sum(np.sum(A1))
count2 = np.sum(np.sum(A2))
count3 = np.sum(np.sum(A3))
count4 = np.sum(np.sum(A4))
count1/A.size, count2/A.size, count3/A.size, count4/A.size
(0.3058, 0.201, 0.3929, 0.1003)
Previous
Next