numpy.random 是 NumPy 库中用于生成随机数的核心模块,提供了多种概率分布的随机数生成方法。
以下是详细说明和使用指南:
模块概览
-
随机数生成器(RNG)
- 旧版:基于 Mersenne Twister 算法(
RandomState) - 新版(推荐):使用
Generator类(PCG64 算法,性能更好) - 初始化生成器:
import numpy as np # 初始化一个生成器, 后续都是用这个生成器来进行各种的操作 rng = np.random.default_rng(seed=42) # 推荐方式(seed 可选)
- 旧版:基于 Mersenne Twister 算法(
-
核心功能分类
- 基础随机数
- 概率分布
- 数据采样
- 随机排列
常用方法详解
1. 基础随机数
| 方法 | 描述 | 示例 |
|---|---|---|
random() | [0.0, 1.0) 的均匀分布浮点数 | rng.random(size=5) → [0.23, 0.75, ...] |
integers(low, high) | 整数随机数(含 low,不含 high) | rng.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,标准差 scale | rng.normal(0, 1, size=3) → [0.5, -1.2, 0.3] |
| 泊松分布 | poisson(lam) | 事件发生率 lam | rng.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,概率 p | rng.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]
最佳实践
- 使用
default_rng()代替旧函数:确保更好的随机性和性能。 - 固定种子:在需要可重复实验时设置
seed。 - 指定
size参数:高效生成多维数组。 - 检查分布参数:如正态分布的
scale是标准差,指数分布的scale是1/λ。
通过 numpy.random,你可以高效生成符合各类统计分布的随机数据,适用于模拟实验、机器学习数据初始化等场景。