15 NumPy数组运算之数组的广播机制

在本章中,我们将讨论NumPy的广播机制,它是进行数组运算时的一个强大功能。通过“广播”,NumPy可以在不同形状的数组之间进行数学运算。这使得数组运算既高效又简洁。我们将在以下几个方面深入探讨广播机制的概念、规则及实例。

什么是广播机制

广播机制是NumPy在进行数组运算时处理不同形状的数组的能力。简单来说,广播会将较小的数组扩展到较大数组的形状,以执行运算。在进行运算时,NumPy会比较两个数组的形状,从而决定如何调整它们。

广播规则

  1. 形状相同: 如果两个数组的形状相同,则可以直接进行运算。
  2. 维度不同: 如果两个数组的维度不同,NumPy会自动在较小的数组前面添加维度,直到它们的维度相同。
  3. 形状不一致的维度: 如果两个数组在某个维度上形状不一致,且其中一个形状为1,则可以广播这个维度为另一个数组的维度。
  4. 不适用的形状: 如果两个数组在某个维度上形状不匹配且均不为1,则无法进行广播。

广播机制的示例

让我们通过一些具体的例子来深入理解广播机制。

示例 1:相同形状的数组

首先,我们来看两个相同形状的数组进行运算的情况:

1
2
3
4
5
6
7
8
9
import numpy as np

a = np.array([[1, 2, 3],
[4, 5, 6]])
b = np.array([[10, 20, 30],
[40, 50, 60]])

result = a + b
print(result)

运行上面的代码将得到:

1
2
[[11 22 33]
[44 55 66]]

在这个例子中,两个数组的形状都是(2, 3),因此可以直接进行加法运算。

示例 2:不同形状的数组

接下来看一个不同形状的数组进行运算的情况:

1
2
3
4
5
a = np.array([1, 2, 3])
b = np.array([[10], [20], [30]])

result = a + b
print(result)

运行上面的代码将得到:

1
2
3
[[11 12 13]
[21 22 23]
[31 32 33]]

在这里,数组a的形状为(3,),而数组b的形状为(3, 1)。NumPy会将a广播到(3, 3)的形状,以便进行加法运算。

示例 3:更复杂的广播

再来看一个更复杂的例子:

1
2
3
4
5
6
a = np.array([[1, 2, 3],
[4, 5, 6]])
b = np.array([10, 20, 30])

result = a + b
print(result)

运行这段代码会得到:

1
2
[[11 22 33]
[14 25 36]]

在这个案例中,a的形状为(2, 3)b的形状为(3,)b会被广播到(2, 3)的形状,进行逐元素的加法运算。

广播机制的应用场景

广播机制的灵活性和高效性在许多情况下都能体现。例如:

  • 在计算统计量时,你可能需要用一个标量来缩放整个数组。
  • 在机器学习中,对特征进行标准化或归一化时,往往需要对不同形状的数据进行操作。

示例:标量与数组结合

1
2
3
4
5
a = np.array([[1, 2, 3],
[4, 5, 6]])

result = a * 2
print(result)

输出结果是:

1
2
[[2 4 6]
[8 10 12]]

在这个例子中,数组 a 中的每个元素都与标量2相乘,其实是通过广播机制完成的。

总结

广播机制是NumPy中一种非常强大的特性,可以简化代码和提升运行效率。了解其工作原理和应用场景往往能让我们在进行数组运算时更加高效灵活。在这一章中,我们探讨了广播的基本概念、规则和示例,下一章将带您进入NumPy的高级功能,探索线性代数的世界。

继续关注第6章 NumPy高级功能之线性代数,我们将学习如何使用NumPy进行线性代数运算,包括矩阵乘法、求逆以及其他相关操作。

15 NumPy数组运算之数组的广播机制

https://zglg.work/numpy-zero/15/

作者

IT教程网(郭震)

发布于

2024-08-10

更新于

2024-08-10

许可协议

分享转发

交流

更多教程加公众号

更多教程加公众号

加入星球获取PDF

加入星球获取PDF

打卡评论