Python / Numpy 随机数

Numpy 随机数

numpy.random 模块对 Python 内置的 random 进行了补充,增加了一些用于高效生成符合多种概率分布的样本值的函数。这一小节将详述如何用 Numpy 快速创建随机数矩阵。

1. 创建符合均匀分布的随机数组

1.1 numpy.random.rand 函数

numpy.random.rand 函数通常用来创建一个服从 “0~1” 均匀分布的随机浮点数(组),随机样本取值范围是[0,1)。函数调用方法如下:

numpy.random.rand(d0, d1, ..., dn)

构造函数接受的参数详解如下:

参数 描述
d0, d1, …, dn 表征生成数组的维数,若不指定则默认返回一个浮点数。

案例

最简单的情况,当不指定任何参数的时候,生成 0-1 之间的随机浮点数:

np.random.rand()
Out:
    0.014109814461294223

相应地,也可以指定产生一个固定维度的数组,例如希望生成一个指定维度为 3×2,服从 “0-1” 均匀分布的数组,可以用如下语句顺利实现:

np.random.rand(3, 2)
Out:
    array([[0.14222306, 0.63311185],
           [0.01911767, 0.91424813],
           [0.86915706, 0.23034553]])

1.2 numpy.random.uniform 函数

numpy.random.uniform 函数可以用来创建一个在指定区间内符合均匀分布的随机数(组)。函数调用方法如下:

numpy.random.uniform(low=0.0, high=1.0, size=None)

构造函数接受的参数详解如下:

参数 描述
low 采样下界,默认值为0;
high 采样上界,默认值为1;采样区间为[low, high)
size 样本维数,为int或tuple类型

案例

在默认情况下,即无任何传参的时候,numpy.random.uniform 和 numpy.random.rand 函数效果类似:

np.random.uniform()
Out:
    0.01472448451244368

其功能都是产生一个 0-1 之间随机浮点数。

在实际应用中,uniform 函数的功能更加强大一些。例如,可以创建一个在0-10之间均匀采样的4×4方阵:

np.random.uniform(0, 10, size=(4,4))
Out:
    array([[9.4065469 , 3.38814606, 7.76009959, 5.56976042],
           [5.39726103, 5.99217826, 1.42095879, 6.53239593],
           [7.41342354, 0.91189054, 9.27952511, 5.98864329],
           [1.26426182, 9.541969  , 3.74923191, 5.0722331 ]])

1.3 numpy.random.randint 函数

numpy.random.randint 函数可以用来创建一个在指定区间内符合均匀分布的随机整数(数组)。函数调用方法如下:

numpy.random.randint(low, high=None, size=None, dtype='l')

构造函数接受的参数详解如下:

参数 描述
low 采样下界,整数类型。当high不指定时,采样区间为[0, low)
high 采样上界,可选。采样区间为[low, high)
size 样本维数,为int或tuple类型
dtype 数组数据类型,可选

案例

在只指定 low 参数的时候,可以用来产生一个随机整数:

np.random.randint(10)
Out:
    5

类似地,也可以在更大范围内采样。例如,对 0-100 之间整数均匀采样:

np.random.randint(0, 100, size=10, dtype=np.int16)
Out:
    array([ 9, 59, 47, 52, 50, 16, 49, 20, 82,  0], dtype=int16)

可以观察发现:size 取整数值时,返回结果为一维数组。

2. 创建符合正态分布的随机数组

正态分布是一种更为常见的特征分布。Numpy 也提供了相应的函数。

2.1 numpy.random.randn函数

numpy.random.randn 函数可以用来创建一个指定维度的、符合标准正态分布(以0为均值、1为标准差)的浮点数(数组)。函数调用方法如下:

numpy.random.randn(d0, d1, ..., dn)

构造函数接受的参数详解如下:

参数 描述
d0, d1, …, dn 表征生成数组的维数,若不指定则默认返回一个浮点数。

案例

最简单的情况,当不指定任何参数的时候,生成 0-1 之间的随机浮点数:

np.random.randn()
Out:
    -0.12290005859272764

相应地,也可以指定产生一个固定维度的数组,例如希望生成一个指定维度为 3×2,服从 “0-1” 均匀分布的数组,可以用如下语句顺利实现:

np.random.randn(3, 2)
Out:
    array([[-0.57391562,  0.06713778],
           [ 1.06383981, -0.36837876],
           [ 1.21325918,  2.83456824]])

可以发现,numpy.random.randn 函数和 numpy.random.rand 函数的调用规则非常相似,不同的地方在于产生随机数的分布不一样。

2.2 numpy.random.normal函数

numpy.random.normal 函数可以用来创建一个指定维度的、符合指定正态分布(以loc为均值、scale为标准差)的浮点数(数组)。函数调用方法如下:

numpy.random.normal(loc=0.0, scale=1.0, size=None)

构造函数接受的参数详解如下:

参数 描述
loc 采样样本分布的均值
scale 采样样本分布的标准差
size 样本维数,为int或tuple类型

案例

在不指定均值和标准差的时候,numpy.random.normal 会产生一个符合标准正态分布的浮点数:

np.random.normal()
Out:
    -0.8810020954896429

相应地,也可以指定分布特征。例如:产生一个大小为 3×2,符合均值为 5,标准差为 10 的正态分布的数组:

arr_rand3 = np.random.normal(5, 10, (3, 2))
Out:
    array([[ -7.77480714,  -2.68529581],
           [  4.40425363,  -8.39891281],
           [-13.08126657,  -9.74238828]])

3. 小结

本节主要介绍了利用 Numpy 内置的 random 方法,创建均匀分布和正态分布的数组。和 Python 内置的 random 模块不同的是,在 Numpy 中,你可以指定 size 参数,来快速生成数组集合,效率较random 模块有了很大的提升。