[python]numpy.random(介绍+使用)

443 阅读3分钟

numpy.random 是 NumPy 库中用于生成随机数的核心模块,提供了多种概率分布的随机数生成方法。

以下是详细说明和使用指南:


模块概览

  1. 随机数生成器(RNG)

    • 旧版:基于 Mersenne Twister 算法(RandomState
    • 新版(推荐):使用 Generator 类(PCG64 算法,性能更好)
    • 初始化生成器:
      import numpy as np
      
      # 初始化一个生成器, 后续都是用这个生成器来进行各种的操作
      rng = np.random.default_rng(seed=42)  # 推荐方式(seed 可选)
      
  2. 核心功能分类

    • 基础随机数
    • 概率分布
    • 数据采样
    • 随机排列

常用方法详解

1. 基础随机数
方法描述示例
random()[0.0, 1.0) 的均匀分布浮点数rng.random(size=5)[0.23, 0.75, ...]
integers(low, high)整数随机数(含 low,不含 highrng.integers(1, 10, size=3)[3, 7, 2]
bytes(length)生成随机字节rng.bytes(4)b'\x9a\xf7\x2c\x01'

2. 概率分布
分布类型方法参数说明示例
均匀分布uniform(low, high)区间 [low, high)rng.uniform(-1, 1, size=3)[-0.4, 0.8, 0.1]
正态分布normal(loc, scale)均值 loc,标准差 scalerng.normal(0, 1, size=3)[0.5, -1.2, 0.3]
泊松分布poisson(lam)事件发生率 lamrng.poisson(5, size=3)[6, 3, 7]
指数分布exponential(scale)参数 scale = 1/λrng.exponential(1.0, size=2)[0.7, 1.5]
二项分布binomial(n, p)试验次数 n,概率 prng.binomial(10, 0.5)6(10次抛硬币正面次数)

3. 数据采样
方法描述示例
choice(a, size, replace, p)从数组 a 中抽样rng.choice([1,2,3], size=2, p=[0.1,0.3,0.6])[3, 2](概率抽样)
shuffle(x)原地打乱序列arr = [1,2,3]; rng.shuffle(arr)arr 变为 [3,1,2]
permutation(x)返回打乱副本(不改变原数组)rng.permutation([1,2,3])[2,3,1]

4. 高级功能
  • 设置随机种子(确保结果可复现):
    rng = np.random.default_rng(seed=123)  # 固定种子
    
  • 多维度输出
    rng.normal(size=(2, 3))  # 生成 2x3 的正态分布矩阵
    
  • 非均匀分布(如 Beta/Gamma 分布):
    rng.beta(a=2, b=5, size=10)  # Beta 分布
    rng.gamma(shape=2, scale=1)  # Gamma 分布
    

新旧版本对比

特性旧版 (np.random.*)新版 (Generator)
初始化np.random.seed(42)rng = default_rng(seed=42)
算法Mersenne Twister (MT19937)PCG64(更优的统计性能)
推荐度❌ 不推荐✅ 推荐

注意:旧版函数(如 np.random.rand())仍可用,但建议迁移到 Generator 方法。


完整示例

import numpy as np

# 1. 初始化生成器
rng = np.random.default_rng(seed=42)

# 2. 生成随机整数
ints = rng.integers(0, 10, size=5)  # [7, 4, 8, 6, 2]

# 3. 生成正态分布数据
normals = rng.normal(loc=0, scale=1, size=(2, 2))
# [[ 0.4967, -0.1383],
#  [ 0.6477,  1.523 ]]

# 4. 从列表抽样
fruits = ["apple", "banana", "cherry"]
samples = rng.choice(fruits, size=2, replace=False, p=[0.5, 0.3, 0.2])
# ['banana', 'cherry']

# 5. 打乱数组
arr = np.arange(5)
rng.shuffle(arr)  # 原地打乱 → [3, 0, 2, 4, 1]

最佳实践

  1. 使用 default_rng() 代替旧函数:确保更好的随机性和性能。
  2. 固定种子:在需要可重复实验时设置 seed
  3. 指定 size 参数:高效生成多维数组。
  4. 检查分布参数:如正态分布的 scale 是标准差,指数分布的 scale1/λ

通过 numpy.random,你可以高效生成符合各类统计分布的随机数据,适用于模拟实验、机器学习数据初始化等场景。