一、numpy.random 模块核心定位
numpy.random 是 numpy 专门用于生成伪随机数的模块(伪随机:基于种子的可复现随机,而非真随机),相比 python 原生 random 库,它的核心优势:
- 支持向量化生成:直接生成多维数组,无需循环(如一次性生成 1000 个正态分布数);
- 覆盖更多统计分布:除了均匀 / 正态分布,还支持泊松、指数、二项分布等;
- 效率更高:底层 c 实现,生成大规模随机数时速度远超 python 原生;
- 可复现性:通过种子(seed)固定随机序列,便于实验复现。
二、先掌握基础:随机种子(seed)
伪随机数的生成依赖 “种子”(初始值),固定种子后,每次生成的随机数完全一致 —— 这是调试、复现实验的关键。
用法示例:
import numpy as np # 1. 全局种子(影响所有random函数) np.random.seed(42) # 固定种子值(任意整数) print(np.random.rand(3)) # [0.3745 0.9507 0.7319] print(np.random.rand(3)) # [0.5986 0.1560 0.1559] # 重置种子,重新生成(结果和第一次完全一致) np.random.seed(42) print(np.random.rand(3)) # [0.3745 0.9507 0.7319] # 2. 局部随机生成器(推荐,不污染全局) rng = np.random.default_rng(seed=42) # 创建独立生成器 print(rng.rand(3)) # [0.7739 0.4389 0.8585]
关键说明:
np.random.seed():全局种子,设置后所有np.random.*函数都受影响;np.random.default_rng():numpy 1.17+ 推荐用法,创建独立的随机生成器,避免全局种子冲突;- 种子值可任意选(如 42、10、2024),核心是 “固定值对应固定随机序列”。
三、常用随机函数分类(按场景)
类别 1:基础随机数(均匀分布)
生成 0~1 均匀分布、指定范围整数 / 浮点数,是最基础的随机数生成方式。
| 函数 | 作用 | 语法 | 示例 |
|---|---|---|---|
| np.random.rand() | 0~1 均匀分布浮点数 | rand(d0,d1,...) | np.random.rand(2,3) → 2 行 3 列 0~1 浮点数 |
| np.random.randn() | 标准正态分布(μ=0, σ=1) | randn(d0,d1,...) | np.random.randn(5) → 5 个标准正态数 |
| np.random.randint() | 指定范围整数 | randint(low, high=none, size, dtype) | np.random.randint(0,10,(2,2)) → 0~9 的 2x2 整数 |
| np.random.uniform() | 指定范围均匀分布浮点数 | uniform(low, high, size) | np.random.uniform(-5,15,31) → -5~15 的 31 个浮点数 |
实战示例(模拟 3 月温度,均匀分布):
import numpy as np
# 生成3月温度:-5~15℃均匀分布,31天,保留1位小数
march_temp = np.round(np.random.uniform(-5, 15, 31), 1)
print("3月温度(均匀分布):", march_temp[:10])
# 输出:[-1.2 8.7 12.3 4.5 9.8 0.7 11.1 7.2 2.9 14.8]
# 生成随机整数(模拟班级人数:30~50人,5个班级)
class_size = np.random.randint(30, 51, size=5)
print("班级人数:", class_size) # 输出:[42 35 48 39 41]类别 2:正态分布随机数(高频!贴合你的场景)
生成指定均值(μ)、标准差(σ)的正态分布数,适合模拟自然数据(温度、分数、身高)。
表格
| 函数 | 作用 | 语法 | 示例 |
|---|---|---|---|
| np.random.normal() | 自定义正态分布 | normal(loc=μ, scale=σ, size) | np.random.normal(100,15,1000) → 均值 100,σ=15,1000 个 |
| np.random.randn() | 标准正态分布(等价于 normal (0,1,size)) | randn(size) | np.random.randn(10) → μ=0, σ=1 |
实战示例(模拟考试分数):
import numpy as np
import matplotlib.pyplot as plt
plt.rcparams['font.sans-serif'] = ['simhei']
plt.rcparams['axes.unicode_minus'] = false
# 生成1000个分数:均值80,标准差10,限制0~100
scores = np.random.normal(80, 10, 1000)
scores = np.clip(scores, 0, 100) # 限制范围
# 绘制直方图验证分布
fig, ax = plt.subplots(figsize=(10, 6))
ax.hist(scores, bins=20, color='skyblue', edgecolor='black')
ax.set_title('考试分数正态分布', fontsize=16)
ax.set_xlabel('分数', fontsize=14)
ax.set_ylabel('人数', fontsize=14)
plt.show()类别 3:随机抽样 / 排列(数据打乱、采样)
用于从已有数据中随机选择、打乱顺序,适合机器学习的数据集划分、随机采样。
表格
| 函数 | 作用 | 语法 | 示例 |
|---|---|---|---|
| np.random.shuffle() | 原地打乱数组(一维 / 二维按行打乱) | shuffle(arr) | arr = [1,2,3]; np.random.shuffle(arr) → [2,1,3] |
| np.random.permutation() | 返回打乱后的新数组(不修改原数组) | permutation(arr/size) | np.random.permutation(5) → [3,1,4,2,0] |
| np.random.choice() | 从数组中随机采样(可重复 / 不重复) | choice(arr, size, replace=true, p=概率) | np.random.choice([1,2,3], size=5, p=[0.2,0.5,0.3]) |
实战示例(数据集随机采样):
import numpy as np
# 原始数据:10个学生id
student_ids = np.arange(1, 11) # [1,2,...,10]
# 1. 打乱数组(原地修改)
np.random.shuffle(student_ids)
print("打乱后的id:", student_ids) # 输出:[7 3 8 1 9 2 5 4 6 10]
# 2. 随机采样5个(不重复,无放回)
sample_ids = np.random.choice(student_ids, size=5, replace=false)
print("采样id(无放回):", sample_ids) # 输出:[3 9 2 6 10]
# 3. 按概率采样(比如抽中1的概率0.8,其他0.05)
prob_sample = np.random.choice([1,2,3,4], size=10, p=[0.8,0.05,0.05,0.1])
print("概率采样结果:", prob_sample) # 输出:[1 1 1 4 1 1 2 1 1 3]类别 4:其他常用分布(专业场景)
适用于特定统计场景,如泊松分布(计数数据)、指数分布(时间间隔)、二项分布(二分类实验)。
表格
| 函数 | 适用场景 | 示例 |
|---|---|---|
| np.random.poisson() | 计数数据(如每天订单数、故障次数) | np.random.poisson(lam=5, size=10) → 均值 5 的泊松数 |
| np.random.exponential() | 时间间隔(如排队等待时间、设备寿命) | np.random.exponential(scale=10, size=5) → 均值 10 的指数数 |
| np.random.binomial() | 二分类实验(如抛硬币、抽奖) | np.random.binomial(n=10, p=0.5, size=3) → 10 次抛硬币正面次数 |
实战示例(模拟每天订单数):
import numpy as np
# 模拟30天订单数:均值20的泊松分布
orders = np.random.poisson(lam=20, size=30)
print("30天订单数:", orders)
print("日均订单:", np.mean(orders)) # 接近20四、高级用法:自定义随机生成器(推荐)
numpy 1.17+ 推出了新的随机 api(generator),替代旧的 np.random.* 全局函数,优势是线程安全、功能更全、避免种子冲突。
用法示例:
import numpy as np
# 创建自定义生成器(固定种子)
rng = np.random.default_rng(seed=42)
# 生成随机数(用法和旧api类似,前缀改为rng.)
print("0~1均匀分布:", rng.rand(3))
print("正态分布:", rng.normal(80, 10, 5))
print("随机整数:", rng.integers(0, 10, size=3))
print("打乱数组:", rng.permutation([1,2,3]))五、避坑点与最佳实践
1. 常见误区
- 混淆 rand/randn/normal:
rand():0~1 均匀分布;randn():标准正态(μ=0, σ=1);normal(loc, scale):自定义正态分布(常用);
- randint 的 high 参数:
randint(0,10)生成 0~9(不包含 10),需注意 “左闭右开”; - shuffle 原地修改:
shuffle(arr)直接修改原数组,如需保留原数组,用permutation()。
2. 最佳实践
- 固定种子:实验 / 调试时必须设置种子,确保结果可复现;
- 使用新生成器:优先用
np.random.default_rng()而非全局seed(); - 大规模生成:生成百万级随机数时,用 numpy 而非 python 原生
random(速度快 100 + 倍); - 范围限制:生成自然数据(温度、分数)时,用
np.clip()限制合理范围,避免极端值。
总结
numpy.random核心是生成伪随机数,通过种子实现可复现,向量化生成效率远超 python 原生;- 高频函数(贴合你的场景):
- 模拟自然数据:
normal()(正态)、uniform()(均匀); - 数据打乱 / 采样:
shuffle()、choice()、permutation(); - 基础随机数:
rand()(0~1)、randint()(整数);
- 模拟自然数据:
- 推荐用法:用
np.random.default_rng()创建自定义生成器,避免全局种子冲突; - 避坑关键:区分不同分布函数,注意
randint左闭右开,生成数据后用clip()限制合理范围。
到此这篇关于numpy.random()函数的具体使用的文章就介绍到这了,更多相关numpy.random()使用内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论