numpy中的随机数函数详解

作者学习中积累总结内容,转载请注明


numpy随机数

随机数对数据分析、统计、机器学习等领域有着重要的作用,可以运用随机数模拟均匀概率事件、统计抽样等,大大方便了数据的生成。NumPy提供了random模块模拟随机数的生成,包括四个方面:

类别功能
生成器设置随机数生成种子
简单随机数产生任意维度的随机数据
分布随机数产生符合指定分布的随机数
排列对指定对象随机排列组合

一、生成器

电脑随机数的生成有以下几个特点:

  • 随机数是由随机种子根据一定的计算方法计算出来的数值。因此, 对于某一个伪随机数发生器,只要设置的种子(seed)相同,产生的随机数就是相同的
  • 如果不设置随机种子,那么在默认情况下随机种子来自系统时钟(即定时/计数器的值)
  • 随机数产生的算法与系统有关,Windows和Linux是不同的,也就是说,即便是随机种子一样,不同系统产生的随机数也不一样

生成器有以下2中设置方式

函数用法
RandomStateRandomState是一个种子类,提供了各种种子方法,最常用seed
seed(s)随机数种子,s是给定的种子值,可以为整数或者矩阵

RandomState():

##生成2行3列的ndarray,其中的每个元素都是[0,1]区间的均匀分布的随机数
rng = np.random.RandomState(42)
arr = rng.uniform( 0 , 1 ,( 2 , 3 ))
array([[0.37454012, 0.95071431, 0.73199394],
       [0.59865848, 0.15601864, 0.15599452]])

seed(s):

np.random.seed(42)
arr = np.random.rand(4,2)
array([[0.37454012, 0.95071431],
       [0.73199394, 0.59865848],
       [0.15601864, 0.15599452],
       [0.05808361, 0.86617615]])

可以看到,以上随机数的在初始化种子后,生成的结果在同一环境下都是一样的,这样的好处可以为数据分析产生可重复实验的样本。可以试下,当不设置种子的时候,每次产生的结果都不一样。

二、简单随机数

主要有以下几种:

函数用法
rand(d0,d_1,..,dn)根据d0‐dn创建d0维随机数数组,浮点数,[0,1),均匀分布
randn(d0,d1,..,dn)根据d0‐dn创建d0维随机数数组,标准正态分布
randint(low,high,[shape])根据shape创建随机整数或整数数组,范围是[low, high)
random_sample([size])在[0,1)内产生随机数,size为随机数的shape
rng1 = np.random.rand(2,3) #产生2行三列均匀分布随机数组
rng2 = np.random.randn(3,3) #三行三列正态分布随机数据
rng3 = np.random.randint(1,100,[3,4]) #(1,100)以内的3行4列随机整数
rng4 = np.random.random_sample([3,5]) #(0,1)以内3行5列随机浮点数

output

rng1:
 [[0.58987085 0.97889286 0.48674215]
 [0.90609879 0.43439437 0.35007841]]
 rng2:
 [[ 1.36443345  1.1720289  -0.37311919]
 [ 0.50359706  2.78393805 -0.0311868 ]
 [-0.01158332  0.19059871  0.60697571]] 
  rng3:
[[37 24 93 46]
 [53 95 99 60]
 [97 63 85 32]]
 rng4:
 [[0.85113667 0.31692201 0.16949275 0.55680126 0.93615477]
 [0.6960298  0.57006117 0.09717649 0.61500723 0.99005385]
 [0.14008402 0.51832965 0.87737307 0.74076862 0.69701574]]

三、分布随机数

常见分布函数如下,其他分布可参考官网文档

函数用法
uniform(low,high,size)均匀分布low起始值,high结束值,size形状
normal(loc,scale,size)正态分布,loc均值,scale标准差,size形状
poisson(lam,size)泊松分布,lam随机事件发生率,size形状
binomial(n, p[, size])二项分布,n为实验的次数,p为结果概率,size形状
lognormal([mean, sigma, size])对数分布,mean为均值,sigma方差,size形状
exponential([scale, size])指数分布,scale为底

生成各分布的一位数组:

import matplotlib.pyplot as plt
unif = np.random.uniform(1,100,100000)
norm = np.random.normal(5,3,100000)
pois = np.random.poisson(0.6,100000)
bino = np.random.binomial(1,0.5,100000)
logn = np.random.lognormal(10,2,100000)
expo = np.random.exponential(2,100000)

fig = plt.figure(figsize=(10,10))
bins = [x for x in range(1,10001)]
ax1 = plt.subplot(321)
plt.hist(unif)
ax2 = plt.subplot(322)
plt.hist(norm)
ax3 = plt.subplot(323)
plt.hist(pois)
ax4 = plt.subplot(324)
plt.hist(bino)
ax5 = plt.subplot(325)
plt.hist(logn)
ax6 = plt.subplot(326)
plt.hist(expo)
plt.show()

随机分布直方图如下:
随机分布
多维数组只需根据需要设置size

norm_arr = np.random.normal(5,3,(2,3,4)) #生成2*3*4数组

output

array([[[ 3.36817988,  0.7155071 ,  4.49439389,  3.27789121],
        [ 3.39113397,  3.33682016,  2.78652485,  5.42348835],
        [ 0.52419521,  6.18728048,  6.01011595,  3.73755554]],

       [[ 5.23402467,  8.55465341,  8.48433401,  6.01352108],
        [ 0.9753412 ,  4.59173626, 12.86128825,  2.36151284],
        [ 5.10499436,  3.52189785,  5.251376  ,  3.54265055]]])

四、排列

函数用法
shuffle(a)根据数组a的第1轴进行随机排列,改变数组x
permutation(a)根据数组a的第1轴产生一个新的乱序数组,不改变数组x
choice(a[,size,replace,p])从一维数组a中以概率p抽取元素,形成size形状新数组replace表示是否可以重用元素,默认为False

shuffle()

shuffle()可以对一维list和两维list进行数据打乱,对于两维list,只对其行数据进行打乱,而不改变行内元素的顺序,python自带的random.shuffle()不能对numpy.array()中的数据进行操作,numpy中的shuffle可以。

shuffle(x)是原地打乱,直接改变x的值,而无返回值。对于多维度的array来说,只对第一维进行随机打乱,比如一个 3×4 的array,只对行之间进行打乱,而行内内容保持不变。

data_list = [1,2,3,4,5,6]
data_arr = np.array([[13, 24, 7, 2],[14, 24, 7, 6],[46, 1, 12, 20]])
np.random.shuffle(data_list)
np.random.shuffle(data_arr)
print('data_list: \n {0} \n data_arr:\n{1}'.format(data_list,data_arr))
data_list: 
 [3, 5, 6, 2, 4, 1] 
 data_arr:
[[46  1 12 20]
 [14 24  7  6]
 [13 24  7  2]]

permutation()

permutation(a)是返回一个被随机打乱过的array,而a不变。对于多维度的array来说,只对第一维进行打乱,比如一个 3×4 的array,只对行之间进行打乱,而行内内容保持不变。

data_list = [1,2,3,4,5,6]
data_arr = np.array([[13, 24, 7, 2],[14, 24, 7, 6],[46, 1, 12, 20]])
data_list_sf = np.random.permutation(data_list)
data_arr_sf = np.random.permutation(data_arr)
print('data_list: \n {0} \n data_list_sf: \n {1}\n data_arr:\n{2} \n data_arr_sf:\n{3}'.format(data_list,data_list_sf,data_arr,data_arr_sf))
data_list: 
[1, 2, 3, 4, 5, 6] 
data_list_sf: 
[3 4 5 2 6 1]
data_arr:
[[13 24  7  2]
[14 24  7  6]
[46  1 12 20]] 
data_arr_sf:
[[14 24  7  6]
[13 24  7  2]
[46  1 12 20]]

shuffle和permutation对于数据分析中随机选择样本具有重要作用

choice()

numpy.random.choice(a, size=None, replace=True, p=None)
从一个给定的一维数组中随机取样

  • a:如果a是一个一维数组,则就是从这个数组中进行随机取样,若a是一个数,则从numpy.arange(a)数组中取样
  • size:取样后输出的形状,例如size = (m, n),就需要采mn个样,并且输出为mn维的矩阵,缺省情况下返回一个数
  • replace:True或者是False,true时采样元素会有重复,false时不会有重复
  • p:一个一维数组,与a的元素一一对应,给出相应元素被采样的概率
np.random.choice(5,3)
array([0, 3, 2])
np.random.choice(5,3,p = [0.2,0.2,0.6,0,0])
array([0, 2, 2])
np.random.choice(5,3,p = [0.1,0.3,0.6,0,0],replace=False)
array([2, 1, 0])

如果只能在2个值中取3个数,设置不重复会报错

np.random.choice(5,3,p = [0,0.4,0.6,0,0],replace=False)
ValueError: Fewer non-zero entries in p than size
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值