Numpy 数组广播规则
在使用Numpy进行数组计算时,通常会遇到不同形状的数组进行运算或者操作。Numpy提供了一种非常方便的解决方法,即数组广播(broadcasting)。本文将介绍Numpy数组广播规则及其应用。
阅读更多:Numpy 教程
什么是数组广播
数组广播是一种在Numpy中,用于处理形状不同的数组进行算术运算的方式。Numpy会自动适应数组的形状,进行element-wise的运算。例如:
import numpy as np
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
c = a + b
print(c)
输出结果为
[5 7 9]
这就是数组广播的实现,Numpy自动将两个形状不同的数组,适应成为相同的形状再计算。
广播的规则
Numpy数组广播的规则如下:
- 如果两个数组的维数不同,那么维数较少的数组在其前面补1,直到维数一致。
- 如果两个数组在某个维度上的长度是相同的,或者其中一个数组在该维度拥有长度为1,那么我们就可以说这两个数组在该维度上是兼容的。
- 如果两个数组在所有维度上都是兼容的,那么它们就能使用广播。
- 根据广播的规则,输出数组的形状是输入数组形状的各个维度上的最大值。
- 如果输入数组的某个维度大小为1,那么在对该维度进行运算时,就好像是在沿着该维度对该单元素进行运算。
理解了数组广播的规则,我们来看几个例子
不同维度长度的广播
import numpy as np
a = np.array([1, 2, 3])
b = 2
c = a + b
print(c)
输出结果为
[3 4 5]
在这里,我们使用了函数np.array()将整数2转化为了一个形状为(1,)的一维数组。然后,根据广播规则第一条,由于数组a的维数是1,我们就在其前面补了1,变成了形状为(1, 3)的二维数组;同时,数组b的维数也是1,也就变成了形状为(1, 1)的二维数组。最终,两个数组在第一维都有1个元素,第二维分别是3和1个元素,于是它们是兼容的,Numpy进行element-wise的运算后得到了正确的结果。
一个维度长度为1的广播
import numpy as np
a = np.array([[1], [2], [3]])
b = np.array([4, 5, 6])
c = a + b
print(c)
输出结果为
[[5 6 7]
[6 7 8]
[7 8 9]]
在这个例子中,我们有一个形状为(3, 1)的二维数组a和一个形状为(1, 3)的二维数组b。它们都只有一个维度的长度是1,于是它们在这个维度上是兼容的。根据广播规则第四条,输出数组的形状为(3, 3),即输入数组的形状的各个维度上的最大值。Numpy自动将两个数组广播成相同的形状,进行element-wise的运算。
实际应用
数组广播在我们日常使用Numpy进行数据计算的过程中,是非常方便的。它可以大大简化代码的编写和运行过程,提高程序的效率。下面通过一些例子来介绍其在实际应用中的使用。
广播与矩阵乘法
矩阵乘法是Numpy中常用的计算方式。但是需要满足矩阵乘法的规则,即矩阵A的列数等于矩阵B的行数。如果这个条件不满足,就需要使用数组广播。例如:
import numpy as np
a = np.array([1, 2, 3]) # 形状为(3,)
b = np.array([[1], [2], [3]]) # 形状为(3, 1)
c = np.dot(a, b)
print(c)
输出结果为
[[14]]
Numpy进行了数组广播,正确地求解了矩阵乘法的结果。
广播与axis参数
在进行数组广播运算时,可以使用axis参数指定运算的轴。例如:
import numpy as np
a = np.array([[1, 2, 3], [4, 5, 6]]) # 形状为(2, 3)
b = np.array([1, 2, 3]) # 形状为(3,)
c = np.sum(a * b, axis=1)
print(c)
输出结果为
[14 32]
在这个例子中,我们使用了*操作符进行广播运算,相当于每一行都乘以了形状为(3,)的一维数组b,并且将乘积再在第二个维度上求和。
广播与复杂计算
在实际应用中,经常需要进行一些复杂的数组广播计算。例如:
import numpy as np
a = np.array([[-1.0, 2.0], [3.0, 4.0]])
b = np.array([1.0, 2.0])
c = a * b[:, np.newaxis]
print(c)
输出结果为
[[-1. 2.]
[ 6. 8.]]
在这个例子中,我们使用了[:, np.newaxis]来扩展形状为(2,)的一维数组b,使得它变成了一个形状为(2, 1)的二维数组。然后,我们利用数组广播,对形状为(2, 2)的数组a和形状为(2, 1)的数组b进行element-wise乘法运算。
总结
本文介绍了Numpy数组广播规则及其应用。数组广播是一种非常方便的计算方式,可以大大简化代码的编写和运行过程,提高程序的效率。在实际应用中,经常需要使用数组广播进行复杂的计算,需要熟练掌握广播的规则和应用方法。
极客笔记