
本文详解np.random.normal(size=...)中size参数如何接收标量或元组(如x.shape),阐明其与输出数组形状的精确对应关系,并通过多维示例演示shape元组如何直接控制采样结果的维度与大小。
本文详解`np.random.normal(size=...)`中`size`参数如何接收标量或元组(如`x.shape`),阐明其与输出数组形状的精确对应关系,并通过多维示例演示`shape`元组如何直接控制采样结果的维度与大小。
在 NumPy 随机数生成函数(如 np.random.normal)中,size 参数决定了返回数组的形状(shape),而非单纯的数量。它接受两种类型输入:
-
整数(如
size=100):生成一维、长度为 100 的数组; -
整数元组(如
size=(2, 3)或size=x.shape):生成指定维度与大小的多维数组,其ndarray.shape将严格等于该元组。
关键在于:x.shape 本身就是一个元组(例如 linspace(1, 2, 100) 返回一维数组,其 shape 为 (100,)),直接传给 size 即等价于 size=(100,) —— 因此 np.random.normal(size=x.shape) 会生成一个形状完全匹配 x 的随机数组,便于后续广播运算或原位替换。
以下为典型示例:
import numpy as np
# 示例 1:一维数组
x_1d = np.linspace(1, 2, 5)
print("x_1d.shape =", x_1d.shape) # (5,)
samples_1d = np.random.normal(size=x_1d.shape)
print("samples_1d.shape =", samples_1d.shape) # (5,)
print("samples_1d =", np.round(samples_1d, 3))
# 输出示例: [ 0.421 -1.189 0.763 -0.234 1.052]
# 示例 2:二维数组
x_2d = np.array([[1, 2, 3], [4, 5, 6]])
print("x_2d.shape =", x_2d.shape) # (2, 3)
samples_2d = np.random.normal(size=x_2d.shape)
print("samples_2d.shape =", samples_2d.shape) # (2, 3)
print("samples_2d =\n", np.round(samples_2d, 3))
# 输出示例:
# [[-0.891 1.204 -0.357]
# [ 0.612 -1.478 0.109]]
# 示例 3:三维兼容性(shape 元组可任意嵌套)
x_3d = np.ones((2, 2, 2))
print("x_3d.shape =", x_3d.shape) # (2, 2, 2)
samples_3d = np.random.normal(size=x_3d.shape)
print("samples_3d.shape =", samples_3d.shape) # (2, 2, 2)
⚠️ 注意事项:
-
size与shape是同构概念:size=(m,n,k)⇔ 输出数组arr.shape == (m,n,k); - 不要混淆
size与len()或总元素数 ——size=(2,3)生成 6 个样本,但组织为 2×3 矩阵,而非一维向量; - 若需生成与某数组相同形状但不同数据类型的随机数组,
size=arr.shape是最简洁、最安全的方式,避免手动解包维度(如size=(arr.shape[0], arr.shape[1])); - 自 NumPy 1.17+ 起,推荐使用
np.random.Generator(如rng = np.random.default_rng(); rng.normal(size=...))替代旧式np.random.*函数,以获得更优的随机性和可重现性。
总结:将 x.shape 直接赋值给 size,本质是利用数组自身的结构信息驱动随机采样布局,是 NumPy 向量化编程中“形状即接口”的典型实践——既保证维度一致性,又提升代码可读性与健壮性。










