NumPy的随机函数子库——numpy.random

NumPy的随机函数子库numpy.random

导入模块:import numpy as np

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

生成一个shape(d0,d1,..,dn)n+1维数组,元素类型为浮点数,元素大小范围是[0,1),均匀分布,随机产生。

例:print(np.random.rand(2, 4, 3)) # 生成形状(2, 3, 4)的数组,元素范围[0,1)

输出:

[[[0.08107628 0.04956067 0.83403251]
  [0.73348641 0.22740465 0.44141622]
  [0.70812428 0.50366491 0.16319069]
  [0.23489969 0.22264408 0.41775059]]

 [[0.27914631 0.21867713 0.58931227]
  [0.6127974  0.70726846 0.14208385]
  [0.15550672 0.51313179 0.42235755]
  [0.74947943 0.31251786 0.93366842]]]

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

生成一个shape(d0,d1,..,dn)n+1维数组,每个元素根据标准正态分布选取(以标准正态分布概率[均值 0 ,方差 1]选取

例:

print(np.random.randn((2, 4, 3)))   # 生成形状(2, 3, 4)的数组,元素按标准正态分布概率选取

输出:

[[[-7.40176849e-01  9.40982449e-01 -1.85626634e+00]
  [-2.14781970e+00 -1.20718936e+00  6.60928168e-02]
  [-8.56319634e-01  7.71651987e-02  6.35307831e-01]
  [ 2.91513583e-01 -1.39772605e-01 -1.48862019e+00]]

 [[ 7.13526535e-01 -3.86690423e-01 -2.77161802e-01]
  [-1.13884190e+00  1.55954273e+00  4.71092318e-01]
  [ 5.78259451e-01 -4.49355023e-01 -1.20299992e+00]
  [ 9.21175204e-01  1.64123963e-03 -4.31770365e-01]]]

3.numpy.random.randint(low[,high,shape])

   numpy.random.random_integers(low, high=None, size=None)

根据shape创建随机整数或整数数组,范围是[low, high)

根据size生成随机整数或整数数组,范围是[low,high](闭区间),若没有输入high值,则取值区间为[1,low],故有要么指定lowhigh,要么low值不得小于1,该函数已经不推荐使用

例:

print(np.random.randint(1, 20, (2, 4, 3)))  # 生成形状(2, 3, 4)的数组,元素从[1,20)中随机选取

输出:

[[[11 10 10]
  [18 16  3]
  [ 3 14 19]
  [ 8 15 13]]

 [[18  7  3]
  [17 19  8]
  [12  8  1]
  [10 10 18]]]

4.numpy.random.random(size)

numpy.random.sample(size)/numpy.random.random_sample(size)

这里的size其实是形状,生成一个size[0,1)的数组,元素类型是浮点数

效果同numpy.random.rand几乎相同,但注意这里size要有自己的括号。

后两个完全相同,随机抽样,默认在[0,1](闭区间),元素不重复。

例:

print(np.random.random((2, 4, 3)))
print(np.random.sample())
print(np.random.random_sample((2, 3)))

输出:

[[[0.21020521 0.37122852 0.03383711]
  [0.23386054 0.7986251  0.8369027 ]
  [0.09217639 0.612044   0.65145477]
  [0.30986865 0.26842161 0.29962382]]

 [[0.99494902 0.4181025  0.87538905]
  [0.68241093 0.55573031 0.78071812]
  [0.70965995 0.74623345 0.7754667 ]
  [0.4329036  0.61242956 0.39635618]]]
  
  0.16432347012964632
  
[[0.85182577 0.04401757 0.46590524]
 [0.00279312 0.42467165 0.89278565]]

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

生成size个符合均匀分布的浮点数,取值范围为:[low,high),默认取值范围为[0,1.0),不指定size则生成一个浮点数

例:

print(np.random.uniform())
print(np.random.uniform(5, 10, (2, 3)))

输出:

0.9781629383822831
[[8.32110262 8.14592369 7.24874029]
 [6.46591872 7.87467467 5.90418415]]

6.numpy.random.RandomState()/numpy.random.seed()

.RandomState()是一个伪随机数生成器,返回一个随机数对象,需要给其赋值到一个对象中,再基于该对象进行随机数生成,如a.rand(4)

.seed()改变当前随机数种子值,功能同Python中的random.seed()功能几乎一样。

二者声明一次生效一次,若想生成相同随机数,必须每次生成前都声明一次。

例:

rsd = np.random.RandomState(10)
print(rsd.rand(2, 3))	# 1
print(rsd.rand(2, 3))	# 2
rsd = np.random.RandomState(10)
print(rsd.rand(2, 3))	# 3

输出:

[[0.77132064 0.02075195 0.63364823]
 [0.74880388 0.49850701 0.22479665]]
[[0.19806286 0.76053071 0.16911084]
 [0.08833981 0.68535982 0.95339335]]
[[0.77132064 0.02075195 0.63364823]
 [0.74880388 0.49850701 0.22479665]]

可见,1,3生成的数组完全相同,2不同。

同理,对于.seed同样如此:

np.random.seed(10)
print(np.random.randint(1, 5, (2, 3)))  # 1
print(np.random.randint(1, 5, (2, 3)))  # 2
np.random.seed(10)
print(np.random.randint(1, 5, (2, 3)))  # 3

输出:

[[2 2 1]
 [4 1 2]]
[[4 1 2]
 [2 1 2]]
[[2 2 1]
 [4 1 2]]

7.numpy.random.bytes(length)

生成长度为length的随机字节,无默认值

例:

st = np.random.bytes(9)
print(st)
print(type(st))
print(len(st))

输出:

b'\x0e\x11\x18\xbd\xb8\xder\x87E'
<class 'bytes'>
9

7.numpy.random.choice(a, size=None, replace=True, p=None)

a(数组)(a必须是一维数组)中选取size(维度)大小的随机数,replace=True表示可重复抽取,pa中每个数出现的概率,默认为等概率;若a是整数,则a代表的数组是arange(a)

例:

a = np.random.randint(100, 200, (12,))
print("数组a:\n", a)
print("等概率可重复抽取:\n", np.random.choice(a, (2, 5)))
print("等概率不重复抽取:\n", np.random.choice(a, (2, 5), replace=False))
print("数字越大概率越大可重复抽取:\n", np.random.choice(a, (2, 5), p=a/np.sum(a)))
print("不指定数组a:\n", np.random.choice(20, (2, 5)))

输出:

数组a:
 [162 115 175 125 187 117 173 160 165 128 170 116]
等概率可重复抽取:
 [[170 175 160 125 116]
 [115 115 173 173 160]]
等概率不重复抽取:
 [[175 116 125 162 170]
 [173 165 128 160 115]]
数字越大概率越大可重复抽取:
 [[162 117 116 160 128]
 [187 162 125 187 116]]
不指定数组a:
 [[ 1 12  3  3  2]
 [ 2  5 11 14 13]]

8.排列

numpy.random.shuffle(a)

根据数组a的第0轴(最外维度)进行随机排列,排列之后,数组a会被改变,该表达式不返回任何值

numpy.random.permutation(a)

根据数组a的第0轴产生一个新的乱序数组,不改变数组a,返回随机排列的新数组

例:

a = np.random.randint(100, 200, (3, 4))
print(a)
np.random.shuffle(a)    # 无返回值
print("第0轴随机排列后数组a:\n", a)   # np.random.shuffle(a)

b = np.random.randint(100, 200, (3, 4))
print("数组b是:\n", b)
c = np.random.permutation(b)
print("数组c是:\n", c)
print("此时数组b是:\n", b)

输出:

[[173 129 130 194]
 [182 189 133 127]
 [176 177 195 102]]
第0轴随机排列后数组a:
 [[182 189 133 127]
 [176 177 195 102]
 [173 129 130 194]]
数组b是:
 [[154 106 121 194]
 [196 185 152 164]
 [100 105 140 105]]
数组c是:
 [[196 185 152 164]
 [154 106 121 194]
 [100 105 140 105]]
此时数组b是:
 [[154 106 121 194]
 [196 185 152 164]
 [100 105 140 105]]

9.部分随机分布函数

正态分布: numpy.random.normal(loc=0.0,scale=1.0,size=None)

一般的形式,返回均值为loc,标准差为scale的正态分布,shapesize参数决定。

numpy.random.standard_normal(size=None)

randn一样,也是返回标准正态分布的数组,不同的是它的shapesize参数指定,对于多维数组,size必须是元组形式;

例:

print(np.random.standard_normal(size=(2, 3)))    # 标准正态分布
print(np.random.normal(loc=2, scale=5, size=(2, 3)))    # 均值为2,方差为5的正态分布

输出:

[[-0.60131876 -0.10213314 -1.8444068 ]
 [ 0.05931106 -0.43175618  1.83188827]]
[[ 5.15009084  4.90896806  5.54834259]
 [-0.19980892 10.94942554 -3.76847748]]

泊松分布: numpy.random.poisson(lam=1.0, size=None)

产生具有泊松分布的数组,lam随机事件发生率,size形状

例:

print(np.random.poisson(lam=2, size=(2, 3)))

输出:

[[7 1 5]
 [2 1 5]]

参考资料

python numpy.random详细解析

官方文档

numpy.random模块用法总结

posted @ 2020-03-01 14:24  一只刍狗  阅读(715)  评论(0)    收藏  举报