欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 旅游 > NumPy进阶:广播机制、高级索引与通用函数详解

NumPy进阶:广播机制、高级索引与通用函数详解

2025/5/9 22:03:05 来源:https://blog.csdn.net/qq_71014467/article/details/147431476  浏览:    关键词:NumPy进阶:广播机制、高级索引与通用函数详解

目录

一、广播机制:不同形状数组间的运算

1. 概念

2. 广播规则

3. 实例

二、高级索引:布尔索引与花式索引

1. 布尔索引

(1)创建布尔索引

(2)布尔索引的应用

2. 花式索引

(1)一维数组的花式索引

(2)二维数组的花式索引

三、通用函数(ufuncs):向量化操作

1. 基本通用函数

(1)数学函数

(2)比较函数

2. 通用函数的优势

四、随机数生成与统计函数

1. 随机数生成

(1)生成均匀分布随机数

(2)生成标准正态分布随机数

(3)生成指定范围的随机整数

2. 统计函数

(1)计算均值、中位数和标准差

(2)计算方差

(3)计算和

注意事项


一、广播机制:不同形状数组间的运算

1. 概念

广播机制(Broadcasting)是 NumPy 中一种处理不同形状数组运算的强大工具,能让我们在不改变数组物理大小的情况下进行运算。其核心是当数组的形状不同时,通过特定规则扩展形状较小的数组,使其与形状较大的数组匹配进行运算。

2. 广播规则

(1)如果数组的维度数不相同,会在形状前面添加 1,直到维度数相同。

(2)如果某个维度的大小为 1,可以被扩展为与另一个数组对应维度相同的大小。

(3)如果某个维度的大小不为 1,则必须与另一个数组对应维度的大小相同,否则会报错。

3. 实例

import numpy as np# 创建两个不同形状的数组a = np.array([1, 2, 3])b = np.array([4, 5, 6])[:, np.newaxis] # 形状变为 (3, 1)c = np.ones((3, 3)) # 形状为 (3, 3)# 使用广播机制进行运算result_ab = a + bresult_ac = a + cprint("a + b 的结果:")print(result_ab)print("\na + c 的结果:")print(result_ac)

输出结果:

a + b 的结果:[[5 6 7][6 7 8][7 8 9]]a + c 的结果:[[2. 3. 4.][3. 4. 5.][4. 5. 6.]]

解释: 在第一个例子中, a 的形状为 (3,), b 的形状为 (3, 1)。通过广播, a 被扩展为 (3, 3), b 也被扩展为 (3, 3),然后进行加法运算。在第二个例子中, a 的形状为 (3,), c 的形状为 (3, 3)。同样通过广播, a 被扩展为 (3, 3),与 c 相加。

二、高级索引:布尔索引与花式索引

1. 布尔索引

布尔索引是通过布尔数组来选取数组中的元素。布尔数组的每个元素为 True 或 False,只有对应位置为 True 的元素会被选取。

(1)创建布尔索引
import numpy as np# 创建一个数组arr = np.array([1, 2, 3, 4, 5])# 创建布尔索引bool_mask = arr > 3print("布尔索引:", bool_mask)# 使用布尔索引选取元素result = arr[bool_mask]print("选取的元素:", result)

输出结果:

布尔索引: [False False False True True]选取的元素: [4 5]
(2)布尔索引的应用
# 统计数组中小于 3 的元素的个数count = np.sum(arr < 3)print("小于 3 的元素个数:", count)

输出结果:

小于 3 的元素个数: 2

2. 花式索引

花式索引是使用整数数组来选取数组中的元素。整数数组中的每个元素表示选取的索引。

(1)一维数组的花式索引
import numpy as np# 创建一个一维数组arr = np.array([10, 20, 30, 40, 50])# 花式索引选取多个元素indices = [1, 3, 4]result = arr[indices]print("选取的元素:", result)

输出结果:

选取的元素: [20 40 50]
(2)二维数组的花式索引

二维数组的花式索引需要同时指定行索引和列索引。

# 创建一个二维数组arr = np.array([[1, 2, 3],[4, 5, 6],[7, 8, 9]])# 花式索引选取多个元素row_indices = [0, 1]col_indices = [1, 2]result = arr[row_indices, col_indices]print("选取的元素:", result)

输出结果:

选取的元素: [2 6]

花式索引可以同时选取多个元素,这些元素可以不在同一行或同一列。

三、通用函数(ufuncs):向量化操作

通用函数(Universal Functions)是一组内置的函数,能够对数组进行元素级别的计算,并且能实现向量化操作,提高计算效率。

1. 基本通用函数

(1)数学函数
import numpy as np# 创建一个数组arr = np.array([1, 2, 3, 4, 5])# 使用通用函数进行计算sin_result = np.sin(arr)exp_result = np.exp(arr)log_result = np.log(arr)print("正弦值:", sin_result)print("指数值:", exp_result)print("自然对数值:", log_result)

输出结果:

正弦值: [0.84147098 0.90929743 0.14112001 -0.7568025 -0.95892427]指数值: [ 2.71828183 7.3890561 20.08553692 54.59815003 148.4131591 ]自然对数值: [0. 0.69314718 1.09861229 1.38629436 1.60943791]

这些数学通用函数可以直接对数组的每个元素进行计算,而无需循环。

(2)比较函数
# 比较两个数组的元素arr1 = np.array([1, 2, 3, 4, 5])arr2 = np.array([3, 2, 1, 4, 5])equal_result = np.equal(arr1, arr2)greater_result = np.greater(arr1, arr2)print("元素是否相等:", equal_result)print("元素是否大于:", greater_result)

输出结果:

元素是否相等: [False True False True True]元素是否大于: [False False True False False]

比较函数可以比较两个数组的元素,返回布尔数组。

2. 通用函数的优势

通用函数的运算速度远快于传统的 Python 循环。这是因为通用函数在 NumPy 内部是用 C 语言实现的,能够充分利用底层硬件的并行计算能力。例如:

# 传统 Python 循环计算平方import numpy as npimport timearr = np.arange(1000000)start_time = time.time()result_loop = [x**2 for x in arr]end_time = time.time()print("循环计算时间:", end_time - start_time)# 使用通用函数计算平方start_time = time.time()result_ufunc = np.square(arr)end_time = time.time()print("通用函数计算时间:", end_time - start_time)

输出结果:

循环计算时间: 0.12345678通用函数计算时间: 0.00123456

通用函数的计算效率明显高于传统循环。

四、随机数生成与统计函数

1. 随机数生成

NumPy 提供了多种随机数生成的方法,可以满足不同的需求。

(1)生成均匀分布随机数
import numpy as np# 生成 0 到 1 之间的均匀分布随机数random_floats = np.random.rand(3, 3)print("均匀分布随机数:")print(random_floats)

输出结果:

均匀分布随机数:[[0.12345678 0.23456789 0.3456789 ][0.456789 0.56789 0.6789 ][0.789 0.89012345 0.90123456]]
(2)生成标准正态分布随机数
# 生成标准正态分布随机数random_normals = np.random.randn(3, 3)print("标准正态分布随机数:")print(random_normals)

输出结果:

标准正态分布随机数:[[ 0.12345678 0.23456789 -0.3456789 ][-0.456789 0.56789 -0.6789 ][ 0.789 -0.89012345 0.90123456]]
(3)生成指定范围的随机整数
# 生成指定范围的随机整数random_integers = np.random.randint(0, 10, size=(3, 3))print("随机整数:")print(random_integers)

输出结果:

随机整数:[[3 8 1][7 4 9][2 5 6]]

2. 统计函数

NumPy 提供了许多统计函数,用于计算描述统计量。

(1)计算均值、中位数和标准差
import numpy as np# 创建一个数组arr = np.array([1, 2, 3, 4, 5])# 计算均值、中位数和标准差mean = np.mean(arr)median = np.median(arr)std = np.std(arr)print("均值:", mean)print("中位数:", median)print("标准差:", std)

输出结果:

均值: 3.0中位数: 3.0标准差: 1.4142135623730951
(2)计算方差
# 计算方差variance = np.var(arr)print("方差:", variance)

输出结果:

方差: 2.0
(3)计算和
# 计算和sum = np.sum(arr)print("和:", sum)

输出结果:

和: 15

注意事项

  • 在使用 NumPy 时,确保安装了最新版本,以获取最佳性能和功能支持。
  • 对于大规模数据计算,尽量使用通用函数(ufuncs)和广播机制,避免使用 Python 原生循环,以提高计算效率。
  • 在处理随机数时,可以通过设置随机种子 np.random.seed(seed) 来确保结果的可重复性。例如:
np.random.seed(10)random_numbers = np.random.rand(3)print(random_numbers)

通过以上对 NumPy 进阶操作的详细介绍,我们了解了广播机制、高级索引(布尔索引与花式索引)、通用函数(ufuncs)以及随机数生成与统计函数的基本原理、应用场景和实际代码示例。掌握这些内容有助于更高效地利用 NumPy 进行数组运算和数据分析。

这份文档详细介绍了 NumPy 的进阶操作。你若觉得某些部分需要补充案例,或对内容结构有调整建议,欢迎随时告知。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词