1.numpy.random 模块
1.1 函数详解
seed 向随机数生成器传递随机状态种子
permutation 返回一个序列的随机排序,或者返回一个乱序的整数范围序列
shuffle 随机排序一个序列
rand 从均匀分布中抽取样本
randint 据给定的范围抽取随机整数
randn 从均值0方差1的正态分布中抽取样本(MATLAB型接口)
binomial 从二项分布中抽取样本
normal 从正态(高斯)分布中抽取样本
beta 从bata分布中抽取样本
chisquare 从卡方分布中抽取样本
gamma 从伽马分布中抽取样本
uniform 从均匀[0,1)分布中抽取样本
normal 可获得 正态分布样本数组
1.2 举例运用
import numpy as np samples = np.random.normal(size=(4, 4)) #4x4正态分布数组 samples #比较np.random和纯python的方式的时间 from random import normalvariate N = 1000000 %timeit samples = [normalvariate(0, 1) for _ in range(N)] %timeit np.random.normal(size=N) #快一个数量级,生成伪随机数 np.random.seed(1234) #获取随机数种子 rng = np.random.RandomState(1234) #创建了一个随机数生成器,使数据独立于其他的随机数状态 rng.randn(10)
import random nwalks = 8 nsteps = 3 steps = np.random.normal(loc=0, scale=0.25,size=(nwalks, nsteps))#正态分布
2 实例应用
2.1 随机漫步
import random import matplotlib.pyplot as plt position = 0 walk = [position] #定义一个数组 steps = 1000 for i in range(steps): step = 1 if random.randint(0, 1) else -1 #从0或1中随机获取值,为1时返回1,反之返回-1 position += step walk.append(position) plt.figure() plt.plot(walk[:100]) #显示数组的前100个
2.2 掷硬币版本随机漫步
import random nsteps = 100 draws = np.random.randint(0, 2, size=nsteps)#取0或1,指定100次 steps = np.where(draws > 0, 1, -1) #满足大于0 则返回1,反之为-1 walk = steps.cumsum() #累计数组的值 walk.min() walk.max() (np.abs(walk) >= 6).argmax() #判断往同一方向走了6步的位置 #argmax:返回的第一个 满足 前面条件(walk的绝对值大于6)的位置,效率不高,扫描整个数组
3 一次性模拟多次随机漫步
import random nwalks = 5000 #行数 nsteps = 1000 #列数 draws = np.random.randint(0, 2, size=(nwalks, nsteps)) # 据给定行列返回0或1的多维数组 steps = np.where(draws > 0, 1, -1) #过滤数据 walks = steps.cumsum(1) walks hits30 = (np.abs(walks) >= 30).any(1) #返回 每行数组中含有满足绝对值大于30的值为true,反之为false的布尔一维数组 hits30 hits30.sum() # 判断布尔一维数组中有多少个ture,即每行中含有绝对值大于30的行数 crossing_times = (np.abs(walks[hits30]) >= 30).argmax(1) #记录每行(含有绝对值大于30的行)中绝对值大于30的值的位置 crossing_times.mean() #获取绝对值大于30的位置的均值
小数据量的数据样例:便于理解
本篇知识点参考《利用python进行数据分析》,更多知识请阅读原书