np.random.normal需传loc(均值)、scale(标准差,非方差)、size;scale为负会静默转正;推荐用default_rng(seed)避免全局影响;不支持向量化loc/scale,需广播或循环;大shape一次生成更高效。

用 np.random.normal 生成正态分布矩阵,均值和方差必须分开传参
直接传 scale(标准差),不是方差。很多人卡在这儿:把方差当标准差传进去,结果生成的矩阵方差是预期的平方。比如想生成方差为 4 的数据,得传 scale=2,而不是 scale=4。
参数顺序是 loc(均值)、scale(标准差)、size(形状)。不支持用关键字传 var 或 sigma —— 这些名字不会被识别,会报 TypeError: normal() got an unexpected keyword argument。
-
loc=0→ 均值为 0 -
scale=1.5→ 标准差为 1.5,对应方差为 2.25 -
size=(3, 4)→ 输出 shape 为 (3, 4) 的二维数组
生成前记得设随机种子,否则每次运行结果都不同
NumPy 的随机数生成器默认不固定状态,同一段代码多次运行会得到完全不同的矩阵。调试或复现实验时,漏掉 np.random.seed() 或 Generator 初始化,会导致结果不可追溯。
推荐用新式 Generator(Python 3.7+ / NumPy 1.17+):
rng = np.random.default_rng(seed=42) data = rng.normal(loc=5, scale=3, size=(1000, 5))
旧写法 np.random.seed(42); np.random.normal(...) 也能用,但全局影响所有后续随机调用,容易被其他模块意外覆盖。
批量生成多个不同均值/标准差的矩阵?不能靠单次调用
np.random.normal 不支持向量化传入多个 loc 或 scale 数组。比如想让每列有不同均值,不能写 loc=[1,2,3], scale=[0.5,1,2], size=(100,3) —— 这会报错或广播出错形状。
正确做法是显式循环或用广播构造:
- 若需每列不同均值:先生成零均值矩阵,再加
loc向量(自动广播)base = rng.normal(0, 1, (100, 3))result = base + np.array([1, 2, 3]) - 若标准差也各列不同:用
np.random.normal(0, 1, size)生成标准正态,再逐列缩放stds = np.array([0.5, 1, 2]).reshape(1, -1)result = base * stds
性能敏感场景下,别在循环里反复调用 normal
如果要生成 100 个 (1000, 1000) 的矩阵,写成 [rng.normal(...) for _ in range(100)] 比一次性生成 (100, 1000, 1000) 慢 2–3 倍——函数调用开销和内存分配更重。
优先用大 shape 一次生成:
all_data = rng.normal(loc=0, scale=1, size=(100, 1000, 1000))
再按需切片。注意:这会占用更多连续内存,如果单次太大导致 OOM,才考虑分块生成。
真正容易被忽略的是:scale 必须是非负数,传负值会静默转为正数(不报错),但逻辑已错;而 size=None 返回标量,不是 0 维数组,这点在做 dtype 推断或后续 reshape 时可能引发隐性 bug。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











