numpy随机抽样字模块

目录

1 随机数

2 随机抽样

3 获取正态分布数组

4 伪随机数


计算机系统生成的随机数都是伪随机数,NumPy 自然也不例外,但它的 random 随机抽样子模块提供了很多便捷的函数,可以满足绝大多数的应用需求。

1 随机数

np.random.random() 是最常用的随机数生成函数,该函数生成的随机数均匀分布于[0, 1) 区间(左闭右开)。默认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 是和全体样本集合等长的权重数组,用于指定对应样本被抽中的概率。

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),示例如下:

print(np.random.randn()) # 标准正态分布,均值为0,标准差为1
print(np.random.randn(5)) #返回数组,5个元素
print(np.random.randn(2,5))  #返回二维数组

如果需要生成非标准正态分布随机数,则应该使用 np.random.normal() 函数。np.random.normal() 函数默认生成均值为 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() 函数可以指定伪随机数生成器的初始化种子,示例:

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))) # 和上面完全一致
​
#得到随机数:
[0.92961609 0.31637555 0.18391881 0.20456028 0.56772503]
[[0.5955447  0.96451452 0.6531771 ]
 [0.74890664 0.65356987 0.74771481]]
[0.92961609 0.31637555 0.18391881 0.20456028 0.56772503]
[[0.5955447  0.96451452 0.6531771 ]
 [0.74890664 0.65356987 0.74771481]]

此外,NumPy 还提供了随机数生成器,可以直接操作这个生成器来生成随机数,示例如下:

r = np.random.RandomState(12345) # 使用随机数生成器也同样
print(r.random(5))
print(r.random((2,3)))

依然能够得到与初始化种子相同的伪随机数。

猜你喜欢

转载自blog.csdn.net/longhaierwd/article/details/131860142
今日推荐