以下代码的前提:import numpy as np
numpy.random模块对python内置的random进行了补充,增加了一些高效生成多种概率分布的样本值的函数。例如可以用normal来得到一个标准正态分布的样本数组。
1 >>> samples = np.random.normal(size=(4, 4)) 2 >>> samples 3 array([[-1.45057151, 0.80108401, 1.3671828 , 0.34067137], 4 [-0.351859 , 1.24758539, -0.26833999, -1.59481081], 5 [-0.81700215, 0.62729444, -0.34062153, -1.38731507], 6 [-0.07054579, 0.48847421, 0.66410904, 0.75402961]]) 7 >>>
下表是部分numpy.random函数。
函数 |
说明 |
seed |
确定随机数生成器的种子 |
permutation |
返回一个序列的随机排列或返回一个随机排列的范围 |
shuffle |
对一个序列就地随机排序 |
rand |
产生均匀分布的样本值 |
randint |
从给定的上下限范围内随机选取整数 |
randn |
产生正态分布(平均值为0,标准差为1)的样本值 |
binomial |
产生二项分布的样本值 |
normal |
产生正态(高斯)分布的样本值 |
beta |
产生beta分布的样本值 |
chisquare |
产生卡方分布的样本值 |
gamma |
产生gamma分布的样本值 |
uniform |
产生在[0, 1)中均匀分布的样本值 |
1.1 范例:随机漫步
(1)简单随机漫步
先用np.random模块一次性产生1000个“掷硬币”的结果,分别设置为1或-1。
1 >>> nsteps = 1000 2 >>> draws = np.random.randint(0, 2, size=nsteps) 3 >>> steps = np.where(draws > 0, 1, -1) 4 >>> walk = steps.cumsum() 5 >>> walk.min() 6 -1 7 >>> walk.max() 8 37 9 >>> (np.abs(walk) >= 10).argmax() #绝对值大于10的元素个数 10 43 11 >>>
(2)一次模拟多个随机漫步
比如一次模拟5000个随机漫步过程。
1 >>> nwalks = 5000 2 >>> nsteps = 1000 3 >>> draws = np.random.randint(0, 2, size=(nwalks, nsteps)) # 0或1 4 >>> draws 5 array([[0, 0, 0, ..., 1, 0, 1], 6 [0, 0, 0, ..., 1, 0, 1], 7 [1, 0, 1, ..., 1, 0, 1], 8 ..., 9 [0, 1, 1, ..., 0, 0, 0], 10 [1, 1, 0, ..., 1, 1, 0], 11 [0, 0, 0, ..., 1, 0, 1]]) 12 >>> steps = np.where(draws > 0, 1, -1) 13 >>> walks = steps.cumsum(1) 14 >>> walks 15 array([[ -1, -2, -3, ..., -38, -39, -38], 16 [ -1, -2, -3, ..., 48, 47, 48], 17 [ 1, 0, 1, ..., -22, -23, -22], 18 ..., 19 [ -1, 0, 1, ..., 40, 39, 38], 20 [ 1, 2, 1, ..., -68, -67, -68], 21 [ -1, -2, -3, ..., 20, 19, 20]], dtype=int32) 22 >>> walks.max() 23 125 24 >>> walks.min() 25 -130 26 >>> hits30 = (np.abs(walks) >= 30).any(1) #轴1 27 >>> hits30.sum() 28 3375 29 >>> crossing_times = (np.abs(walks[hits30]) >= 30).argmax(1) #轴1 30 >>> crossing_times.mean() 31 500.616 32 >>>