(13)numpy基础5:random模块 伪随机数生成及使用

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进行数据分析》,更多知识请阅读原书

<think>嗯,用户想了解NumPy库中的random模块。我需要先回忆一下这个模块的基本功能和常用方法。首先,应该提到random模块是用来生成随机数的,但和Python内置的random模块不同,NumPy的版本更高效,适合处理数组。然后,可能用户需要一些常见的函数,比如生成不同分布的随机数,或者设置随机种子。 接下来,我需要分点介绍,可能包括随机生成的基本方法,比如rand、randn、randint这些。然后是不同的分布,如均匀分布、正态分布等。还要提到随机种子设置的重要性,比如使用seed函数来保证结果可重复。另外,可能用户对随机抽样或排列感兴趣,比如shuffle和permutation函数。 用户可能是数据科学或机器学习的学习者,可能需要生成模拟数据或进行数据预处理。因此,除了基本函数外,还应该举一些例子,比如生成随机数组,或者打乱数据集顺序。还要注意说明各个参数的意义,比如shape参数在生成数组时的作用。 需要避免过于深入复杂的细节,保持介绍简洁明了。可能用户是刚开始接触NumPy,所以语言要通俗易懂。同时,要确保覆盖主要功能,让用户有一个全面的了解。最后,提醒用户注意版本变化,比如新的Generator替代旧接口的情况,这样他们能使用推荐的方法。</think>NumPy 的 `random` 模块是用于生成**伪随机数**和随机操作的强大工具,广泛应用于科学计算、数据分析和机器学习中。它比 Python 内置的 `random` 模块更高效,尤其适合处理数组和大规模数据生成。 --- ### **核心功能概览** 1. **基础随机生成**: - `rand()`: 生成 `[0, 1)` 之间的均匀分布随机数(可指定形状)。 ```python import numpy as np np.random.rand(2, 3) # 生成 2x3 的随机数组 ``` - `randn()`: 生成标准正态分布(均值为0,标准差为1)的随机数。 ```python np.random.randn(5) # 生成5个正态分布随机数 ``` - `randint()`: 生成指定范围内的随机整数。 ```python np.random.randint(1, 100, size=(3,3)) # 3x3矩阵,值在[1,100) ``` 2. **概率分布生成**: - 均匀分布:`uniform(low, high, size)` - 正态分布:`normal(loc=均值, scale=标准差, size)` - 泊松分布:`poisson(lam=λ, size)` - 二项分布:`binomial(n, p, size)` - 其他:`exponential`, `beta`, `gamma` 等。 3. **随机抽样与排列**: - `shuffle()`: 原地打乱数组顺序。 ```python arr = np.array([1, 2, 3]) np.random.shuffle(arr) # arr可能变为 [3,1,2] ``` - `permutation()`: 返回打乱后的数组副本(不修改原数组)。 - `choice()`: 从数组中随机抽取元素。 ```python np.random.choice([2,4,6], size=5, p=[0.1,0.6,0.3]) # 按概率抽样 ``` 4. **随机种子控制**: - `seed(seed_value)`: 设置随机种子,确保结果可复现。 ```python np.random.seed(42) # 固定随机性 ``` --- ### **现代推荐用法(NumPy 1.17+)** 新版本推荐使用 `Generator` 类(基于 PCG64 算法,更高效安全): ```python rng = np.random.default_rng(seed=42) # 创建生成器对象 rng.uniform(0, 1, size=5) # 生成均匀分布 rng.standard_normal(100) # 生成标准正态分布 ``` --- ### **典型应用场景** 1. 数据预处理:打乱数据集顺序(如训练集)。 2. 模拟数据:生成符合特定分布的测试数据。 3. 蒙特卡洛方法:通过大量随机采样进行数值计算。 --- ### **注意事项** - **伪随机性**:生成随机数依赖初始种子,并非真正的随机。 - **性能**:生成大规模数据时,优先使用 `size` 参数直接创建数组,而非循环。 如果需要更高级的随机功能(如多元分布),可结合 `scipy.stats` 库使用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值