第七章:NumPy 随机数生成 (`np.random` 模块)


文档摘要

第七章:NumPy 随机数生成 ( 模块) 第七章:NumPy 随机数生成 ( 模块) 7.1 模块概览 模块主要包含以下几个部分: Simple random data: 生成简单的随机数据,例如均匀分布、整数等。 Permutations: 随机排列序列。 Distributions: 生成各种概率分布的随机数,例如正态分布、泊松分布、二项分布等。 Random generator: 控制随机数生成器的状态,保证可重复性。 7.2 Simple random data 这部分函数用于生成指定形状和分布的简单随机数据。 : 生成服从均匀分布([0, 1))的随机数,形状由 指定。 : 生成服从标准正态分布(均值为 0,标准差为 1)的随机数,形状由 指定。 : 生成指定范围内的随机整数。

第七章:NumPy 随机数生成 (np.random 模块)

第七章:NumPy 随机数生成 (np.random 模块)

7.1 np.random 模块概览

np.random 模块主要包含以下几个部分:

  • Simple random data: 生成简单的随机数据,例如均匀分布、整数等。

  • Permutations: 随机排列序列。

  • Distributions: 生成各种概率分布的随机数,例如正态分布、泊松分布、二项分布等。

  • Random generator: 控制随机数生成器的状态,保证可重复性。

7.2 Simple random data

这部分函数用于生成指定形状和分布的简单随机数据。

  • rand(d0, d1, ..., dn): 生成服从均匀分布([0, 1))的随机数,形状由 d0, d1, ..., dn 指定。

    import numpy as np # 生成一个形状为 (2, 3) 的均匀分布随机数数组 random_array = np.random.rand(2, 3) print(random_array)
  • randn(d0, d1, ..., dn): 生成服从标准正态分布(均值为 0,标准差为 1)的随机数,形状由 d0, d1, ..., dn 指定。

    # 生成一个形状为 (2, 3) 的标准正态分布随机数数组 random_array = np.random.randn(2, 3) print(random_array)
  • randint(low, high=None, size=None, dtype=int): 生成指定范围内的随机整数。

    • low: 最小值(包含)。

    • high: 最大值(不包含)。如果未指定,则范围为 [0, low)。

    • size: 输出数组的形状。

    • dtype: 输出数组的数据类型。

    # 生成一个 0 到 10 之间的随机整数 random_integer = np.random.randint(10) print(random_integer) # 生成一个形状为 (2, 3) 的 1 到 10 之间的随机整数数组 random_integer_array = np.random.randint(1, 10, size=(2, 3)) print(random_integer_array)
  • random_sample(size=None): 生成服从均匀分布([0, 1))的随机数,类似于 rand,但 size 参数可以是一个元组。

    # 生成一个形状为 (2, 3) 的均匀分布随机数数组 random_array = np.random.random_sample(size=(2, 3)) print(random_array)
  • random(size=None):random_sample 功能相同。

  • ranf(size=None):random_sample 功能相同。

  • sample(size=None):random_sample 功能相同。

7.3 Permutations

这部分函数用于随机排列序列。

  • permutation(x): 随机排列一个序列,返回一个新的排列后的数组。如果 x 是一个整数,则先生成 np.arange(x),然后再进行排列。

    # 随机排列一个数组 arr = np.array([1, 2, 3, 4, 5]) permuted_arr = np.random.permutation(arr) print(permuted_arr) # 随机排列一个范围 permuted_range = np.random.permutation(5) print(permuted_range)
  • shuffle(x): 原地随机排列一个序列。

    # 原地随机排列一个数组 arr = np.array([1, 2, 3, 4, 5]) np.random.shuffle(arr) print(arr) # arr 的值被修改

7.4 Distributions

这部分函数用于生成各种概率分布的随机数。 以下是一些常用的分布:

  • 正态分布 (Normal Distribution):

    • normal(loc=0.0, scale=1.0, size=None): 生成服从正态分布的随机数。

      • loc: 均值 (mean)。

      • scale: 标准差 (standard deviation)。

      • size: 输出数组的形状。

    # 生成一个均值为 0,标准差为 1 的正态分布随机数 normal_random = np.random.normal(loc=0, scale=1, size=(2, 3)) print(normal_random)
  • 均匀分布 (Uniform Distribution):

    • uniform(low=0.0, high=1.0, size=None): 生成服从均匀分布的随机数。

      • low: 最小值(包含)。

      • high: 最大值(不包含)。

      • size: 输出数组的形状。

    # 生成一个 1 到 10 之间的均匀分布随机数 uniform_random = np.random.uniform(low=1, high=10, size=(2, 3)) print(uniform_random)
  • 二项分布 (Binomial Distribution):

    • binomial(n, p, size=None): 生成服从二项分布的随机数。

      • n: 试验次数。

      • p: 每次试验成功的概率。

      • size: 输出数组的形状。

    # 模拟 10 次抛硬币,每次成功的概率为 0.5 binomial_random = np.random.binomial(n=10, p=0.5, size=(2, 3)) print(binomial_random) # 结果表示每次试验成功的次数
  • 泊松分布 (Poisson Distribution):

    • poisson(lam, size=None): 生成服从泊松分布的随机数。

      • lam: 事件发生的平均速率。

      • size: 输出数组的形状。

    # 生成一个平均速率为 5 的泊松分布随机数 poisson_random = np.random.poisson(lam=5, size=(2, 3)) print(poisson_random) # 结果表示在单位时间内事件发生的次数
  • 指数分布 (Exponential Distribution):

    • exponential(scale=1.0, size=None): 生成服从指数分布的随机数。

      • scale: 尺度参数,相当于 1/lambda,其中 lambda 是泊松过程中事件发生的平均速率。

      • size: 输出数组的形状。

    # 生成一个尺度参数为 2 的指数分布随机数 exponential_random = np.random.exponential(scale=2, size=(2, 3)) print(exponential_random) # 结果表示事件发生的时间间隔
  • 伽马分布 (Gamma Distribution):

    • gamma(shape, scale=1.0, size=None): 生成服从伽马分布的随机数。

      • shape: 形状参数 (k)。

      • scale: 尺度参数 (theta)。

      • size: 输出数组的形状。

    # 生成一个形状参数为 2,尺度参数为 2 的伽马分布随机数 gamma_random = np.random.gamma(shape=2, scale=2, size=(2, 3)) print(gamma_random)
  • 其他分布: np.random 模块还提供了许多其他分布,例如 beta 分布、chisquare 分布、f 分布等。

7.5 Random generator

这部分函数用于控制随机数生成器的状态。 为了保证实验的可重复性,我们需要设置随机数种子。

  • seed(seed=None): 设置随机数种子。 相同的种子会产生相同的随机数序列。

    # 设置随机数种子 np.random.seed(42) # 生成随机数 random_array1 = np.random.rand(2, 3) print(random_array1) # 再次设置相同的随机数种子 np.random.seed(42) # 生成随机数 random_array2 = np.random.rand(2, 3) print(random_array2) # random_array1 和 random_array2 的值相同
  • default_rng(seed=None): 创建一个新的随机数生成器。 这是NumPy 1.17版本引入的,推荐使用的方式。

    # 创建一个新的随机数生成器 rng = np.random.default_rng(42) # 使用生成器生成随机数 random_array1 = rng.random((2, 3)) print(random_array1) # 再次创建相同的随机数生成器 rng = np.random.default_rng(42) # 使用生成器生成随机数 random_array2 = rng.random((2, 3)) print(random_array2) # random_array1 和 random_array2 的值相同

    使用 default_rng 的好处是:

    • 更好的随机性: 新的生成器算法 (PCG64) 比旧的算法 (Mersenne Twister) 具有更好的统计特性。

    • 线程安全: 每个生成器对象都是独立的,可以安全地在多线程环境中使用。

    • 更灵活: 可以创建多个独立的生成器,每个生成器都有自己的状态。

7.6 代码实践

以下是一些使用 np.random 模块进行模拟的示例:

  • 模拟抛硬币:

    # 模拟抛硬币 100 次 n_trials = 100 probabilities = np.random.uniform(size=n_trials) #生成0-1的随机数 results = probabilities > 0.5 #概率大于0.5 认为是正面 heads = np.sum(results) print(f"抛硬币 {n_trials} 次,正面朝上的次数为:{heads}")
  • 模拟掷骰子:

    # 模拟掷骰子 100 次 n_trials = 100 results = np.random.randint(1, 7, size=n_trials) #骰子的点数为1-6 print(f"掷骰子 {n_trials} 次,结果为:{results}") # 统计每个点数出现的次数 counts = np.bincount(results)[1:] # bincount 会统计0-6,我们只需要1-6 print(f"每个点数出现的次数:{counts}")
  • 模拟正态分布数据:

    import matplotlib.pyplot as plt # 生成 1000 个服从正态分布的随机数 data = np.random.normal(loc=0, scale=1, size=1000) # 绘制直方图 plt.hist(data, bins=30) plt.xlabel("Value") plt.ylabel("Frequency") plt.title("Histogram of Normal Distribution") plt.show()

7.7 总结

np.random 模块是 NumPy 中用于生成随机数的强大工具。 它提供了各种函数来生成不同分布的随机数,并控制随机数生成器的状态。 掌握 np.random 模块的使用,可以帮助我们进行各种统计模拟、机器学习和数据分析任务。 default_rng 是推荐的随机数生成方式,因为它提供了更好的随机性和线程安全性。

希望本章内容能够帮助你更好地理解和使用 np.random 模块。 在实际应用中,可以根据具体需求选择合适的随机数生成函数和分布。 通过设置随机数种子,可以保证实验的可重复性,方便调试和验证。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U