Numpy 广播机制简介
在Numpy中,我们可以使用广播机制进行矩阵计算。其实所谓的广播就是指将不同大小的数组进行适当的扩展(比如对于较小的数组自动填充0),使得它们具有相同的形状。接着,对于每个元素,只需在对应的位置进行计算即可。
阅读更多:Numpy 教程
广播机制的规则
Numpy的广播机制遵循一套规则,我们来逐条介绍:
- 如果两个数组的维数不同,则将维度较小的数组进行拓展,直到维数匹配为止,新维度中的值为1。
- 如果两个数组在某个维度的大小相同或者其中一个数组在该维度中的大小为1,则称这两个数组在该维度上是兼容的,可以进行广播。
- 如果两个数组在所有维度上都是兼容的,则可以直接进行计算。
我们可以利用Numpy提供的函数numpy.broadcast_arrays(),将两个不同维度的数组(如一维数组和二维数组)进行扩展,以及过程中遇到的问题进行展示:
import numpy as np
# 广播数组的例子
a = np.array([1, 2, 3])
b = np.array([[1, 2, 3], [4, 5, 6]])
c, d = np.broadcast_arrays(a, b)
print(c)
print(d)
输出结果如下:
[[1 2 3]
[1 2 3]]
[[1 2 3]
[4 5 6]]
上述结果说明,Numpy在进行广播时,会将一维数组a扩展为二维数组,使其与b维数相同,在进行元素计算。
广播机制的应用
下面,我们将通过三个例子,来具体看看在实际中如何应用广播机制。
例子一:对数组的每一列进行减去列的均值
对于这个例子,我们首先需要求出每一列的均值,然后将每一列元素减去该列的均值。使用Numpy的广播机制,这个问题就变得非常简单了。
import numpy as np
a = np.random.rand(3, 4)
print(a)
# 对每列元素减去该列的均值
a = a - a.mean(axis=0)
print(a)
上述例子中,我们使用a.mean(axis=0)计算每一列的均值,再使用广播机制实现将每一列元素减去该列的均值。
例子二:逐元素比较两个数组并得到较大值
这个例子展示了如何使用广播机制比较两个数组并得到较大值。
import numpy as np
a = np.array([1, 2, 3])
b = np.array([2, 1, 4])
# 比较每个元素,获取较大值
c = np.where(a > b, a, b) # np.where(condition, x, y),满足条件(condition),输出x,不满足输出y
print(c)
在该例子中,我们使用Numpy的函数numpy.where()来实现比较两个数组的功能,得到较大值。
例子三:矩阵乘法
这个例子说明了矩阵乘法在Numpy中的实现。
import numpy as np
a = np.array([[1, 0], [0, 1]])
b = np.array([1, 2])
# 矩阵乘法
c = np.dot(a, b)
print(c)
上述例子中,我们使用numpy.dot()函数来进行矩阵乘法。用Numpy实现矩阵乘法时,广播机制和隐式转换会自动进行,从而使得两个数组可以进行乘法运算。例如,在上面的例子中,b本来是一维数组,但由于它与a进行乘法运算,因此Numpy会自动将其转化为二维数组,以适应运算要求。
总结
Numpy的广播机制使我们在进行数组计算时可以更加灵活、高效。我们可以通过广播机制对形状不同的数组进行计算,而无需手动调整其形状。掌握了广播机制的原理和规则,我们可以应用它来更加方便地进行数据分析和科学计算。
极客笔记