作者学习中积累总结内容,转载请注明
numpy随机数
随机数对数据分析、统计、机器学习等领域有着重要的作用,可以运用随机数模拟均匀概率事件、统计抽样等,大大方便了数据的生成。NumPy提供了random模块模拟随机数的生成,包括四个方面:
类别 | 功能 |
---|---|
生成器 | 设置随机数生成种子 |
简单随机数 | 产生任意维度的随机数据 |
分布随机数 | 产生符合指定分布的随机数 |
排列 | 对指定对象随机排列组合 |
一、生成器
电脑随机数的生成有以下几个特点:
- 随机数是由随机种子根据一定的计算方法计算出来的数值。因此, 对于某一个伪随机数发生器,只要设置的种子(seed)相同,产生的随机数就是相同的
- 如果不设置随机种子,那么在默认情况下随机种子来自系统时钟(即定时/计数器的值)
- 随机数产生的算法与系统有关,Windows和Linux是不同的,也就是说,即便是随机种子一样,不同系统产生的随机数也不一样
生成器有以下2中设置方式
函数 | 用法 |
---|---|
RandomState | RandomState是一个种子类,提供了各种种子方法,最常用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