NumPy-随机数生成详解

NumPy-随机数生成详解

NumPy作为Python数值计算的核心库,提供了功能强大、性能高效的随机数生成模块------numpy.random,该模块不仅能生成各种分布的随机数,还能满足可重复性、批量生成等需求。

一、随机数生成的基础:伪随机数与种子

1. 伪随机数的本质

计算机生成的随机数并非真正意义上的随机,而是通过确定性算法产生的伪随机数。这些随机数看似无规律,但实际上由初始值(种子)完全决定。只要种子相同,生成的随机数序列就会完全一致,这一特性为实验的可重复性提供了保障。

2. 种子的设置:确保结果可复现

通过np.random.seed()函数可以设置随机数种子,固定随机数序列:

python 复制代码
import numpy as np

# 设置种子
np.random.seed(42)
# 生成随机数
print(np.random.rand(3))  # [0.37454012 0.95071431 0.73199394]

# 重新设置相同种子,生成相同序列
np.random.seed(42)
print(np.random.rand(3))  # [0.37454012 0.95071431 0.73199394]

在科研实验或程序调试中,设置种子能确保多次运行的结果一致,便于问题定位和结果验证。

二、常用随机数生成函数

1. 均匀分布随机数

均匀分布是最常用的随机分布之一,其随机数在指定区间内均匀取值。

  • np.random.rand(d0, d1, ..., dn):生成[0, 1)区间内的均匀分布随机数,形状由参数指定。

    python 复制代码
    # 生成2行3列的均匀分布随机数
    arr = np.random.rand(2, 3)
    print(arr)
    # 输出:
    # [[0.59865848 0.15601864 0.15599452]
    #  [0.05808361 0.86617615 0.60111501]]
  • np.random.uniform(low=0.0, high=1.0, size=None):生成[low, high)区间内的均匀分布随机数,更灵活地指定范围。

    python 复制代码
    # 生成5个[10, 20)区间的均匀分布随机数
    arr = np.random.uniform(10, 20, size=5)
    print(arr)  # [12.05844943 17.8158732  11.18274425 16.17365467 12.11334366]

2. 正态分布随机数

正态分布(高斯分布)是自然界中最常见的分布之一,许多现象都近似遵循正态分布。

  • np.random.randn(d0, d1, ..., dn):生成均值为0、标准差为1的标准正态分布随机数。

    python 复制代码
    # 生成3个标准正态分布随机数
    arr = np.random.randn(3)
    print(arr)  # [0.49671415 -0.1382643  0.64768854]
  • np.random.normal(loc=0.0, scale=1.0, size=None):生成均值为loc、标准差为scale的正态分布随机数。

    python 复制代码
    # 生成2行2列、均值为5、标准差为2的正态分布随机数
    arr = np.random.normal(loc=5, scale=2, size=(2, 2))
    print(arr)
    # 输出:
    # [[4.87300259 3.87939188]
    #  [5.85916983 6.23844269]]

3. 整数随机数

在需要生成离散整数的场景中,以下函数非常实用。

  • np.random.randint(low, high=None, size=None, dtype=int):生成[low, high)区间内的整数随机数。

    python 复制代码
    # 生成5个[1, 10)区间的整数
    arr = np.random.randint(1, 10, size=5)
    print(arr)  # [3 7 8 5 9]
  • np.random.choice(a, size=None, replace=True, p=None):从数组a中随机选择元素,可指定概率分布。

    python 复制代码
    # 从[1, 2, 3]中随机选择3个元素(可重复)
    arr = np.random.choice([1, 2, 3], size=3)
    print(arr)  # [2 1 3]
    
    # 按指定概率选择元素(p的和必须为1)
    arr = np.random.choice([1, 2, 3], size=3, p=[0.1, 0.6, 0.3])
    print(arr)  # [2 2 3](2被选中的概率更高)

4. 其他常用分布

除了上述分布,numpy.random还支持多种其他分布的随机数生成,如指数分布、泊松分布等。

  • np.random.exponential(scale=1.0, size=None):生成指数分布随机数,scale为1/λ。

    python 复制代码
    arr = np.random.exponential(scale=2, size=3)
    print(arr)  # [1.52275333 0.88770418 3.14869517]
  • np.random.poisson(lam=1.0, size=None):生成泊松分布随机数,lam为λ(均值和方差)。

    python 复制代码
    arr = np.random.poisson(lam=3, size=4)
    print(arr)  # [4 2 3 5]

三、随机数生成的进阶操作

1. 随机排列与洗牌

在需要打乱数据顺序的场景中,随机排列函数非常有用。

  • np.random.permutation(x):返回一个随机排列的数组,或对整数序列进行随机排列。

    python 复制代码
    # 对数组进行随机排列
    arr = np.array([1, 2, 3, 4, 5])
    permuted = np.random.permutation(arr)
    print(permuted)  # [3 5 1 2 4]
    
    # 生成0-4的随机排列
    permuted = np.random.permutation(5)
    print(permuted)  # [2 4 1 0 3]
  • np.random.shuffle(x):原地打乱数组x的顺序(无返回值)。

    python 复制代码
    arr = np.array([1, 2, 3, 4, 5])
    np.random.shuffle(arr)
    print(arr)  # [5 2 4 1 3]

2. 控制随机数的维度与形状

NumPy的随机数生成函数支持通过size参数灵活指定输出数组的形状,无论是一维、二维还是更高维数组,都能轻松生成。

python 复制代码
# 生成3维数组(2×3×4)的均匀分布随机数
arr = np.random.rand(2, 3, 4)
print(arr.shape)  # (2, 3, 4)

四、随机数生成的应用场景

1. 数据增强

在机器学习中,为了扩充训练数据、提高模型的泛化能力,常对原始数据进行随机变换,如随机裁剪、随机翻转等,这些操作都依赖于随机数生成。

python 复制代码
# 模拟对图像进行随机水平翻转(50%概率)
def random_flip(image):
    if np.random.rand() > 0.5:
        return image[:, ::-1]  # 水平翻转
    return image

# 假设image是一个二维图像数组
image = np.array([[1, 2, 3], [4, 5, 6]])
flipped_image = random_flip(image)
print(flipped_image)

2. 蒙特卡洛模拟

蒙特卡洛模拟通过大量随机抽样来求解复杂问题,在金融、物理等领域有广泛应用。例如,用蒙特卡洛方法估算圆周率:

python 复制代码
n = 1000000  # 抽样次数
x = np.random.uniform(-1, 1, n)
y = np.random.uniform(-1, 1, n)
# 计算落在单位圆内的点的数量
inside = (x**2 + y**2) <= 1
pi_estimate = 4 * np.sum(inside) / n
print(pi_estimate)  # 约为3.14(随着n增大,精度提高)

3. 随机初始化参数

在机器学习模型训练前,通常需要随机初始化模型参数(如权重矩阵),正态分布和均匀分布是常用的初始化方式。

python 复制代码
# 随机初始化一个3×2的权重矩阵(均值0,标准差0.01)
weights = np.random.normal(loc=0, scale=0.01, size=(3, 2))
print(weights)
# 输出:
# [[-0.00463418 -0.00465729]
#  [ 0.01523029  0.00375698]
#  [-0.00634322 -0.00362741]]

五、注意事项

  1. 种子的作用范围np.random.seed()设置的种子只对后续的numpy.random模块函数有效,且在多线程环境中可能会出现种子混乱的问题,此时可使用numpy.random.RandomState创建独立的随机数生成器。

    python 复制代码
    # 创建独立的随机数生成器
    rng = np.random.RandomState(42)
    print(rng.rand(3))  # [0.37454012 0.95071431 0.73199394]
  2. 性能考量 :NumPy的随机数生成函数底层由C实现,性能远优于Python原生的random模块,尤其在生成大规模随机数时,优势更为明显。

  3. 分布参数的选择:不同的应用场景需要选择合适的分布。例如,初始化神经网络权重时,常用正态分布或均匀分布;模拟等待时间时,常用指数分布。

That's all, thanks for reading~~

觉得有用就点个赞、收进收藏夹吧!关注我,获取更多干货~

相关推荐
CoooLuckly3 小时前
numpy数据分析知识总结
python·numpy
GG不是gg13 小时前
NumPy-统计函数详解
numpy
超龄超能程序猿1 天前
(3)机器学习小白入门 YOLOv: 解锁图片分类新技能
python·numpy·pandas·scipy
好开心啊没烦恼2 天前
Python 数据分析:numpy,说人话,说说数组维度。听故事学知识点怎么这么容易?
开发语言·人工智能·python·数据挖掘·数据分析·numpy
GG不是gg3 天前
NumPy-核心函数np.matmul()深入解析
numpy
GG不是gg4 天前
NumPy-核心函数np.dot()深入理解
numpy
好开心啊没烦恼4 天前
Python 数据分析:numpy,抽提,整数数组索引与基本索引扩展(元组传参)。听故事学知识点怎么这么容易?
开发语言·人工智能·python·数据挖掘·数据分析·numpy·pandas
小高求学之路16 天前
MinIO centos 7 离线(内网) 一键部署安装
python·centos·numpy
NLxxxxX16 天前
爬虫获取数据:selenium的应用
开发语言·爬虫·python·selenium·测试工具·numpy·pandas