NumPy 广播(Broadcast)
NumPy广播(Broadcast)是指让不同形状的数组进行数学运算的一种机制。在进行计算时,NumPy会自动地对数组进行扩展,使得在运算中可以使用不同形状的数组。在NumPy中,广播广泛应用于对数组的重构和计算。
原始数组可以具有不同的形状,NumPy在数组维度的不匹配的情况下,会进行广播操作以匹配它们。简单的说,较小的数组会通过自动广播机制而转化为较大的数组,以便进行数学运算。
以下是一个简单的示例数组:
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
这一示例中,a和b是两个具有相同形状(即(3,))的一维数组,可以直接相加:
c = a + b
print(c)
#Output: array([5, 7, 9])
这里并没有进行广播操作。但是,如果我们对其中一个数组进行扩展,例如:
d = np.array([[4],[5],[6]])
此时d为一个(3,1)形状的二维数组。在运算过程中,NumPy会将此二维数组广播成形状为(3,3)的二维数组,然后再进行数学运算:
e = a + d
print(e)
#Output: array([[5, 6, 7],
# [6, 7, 8],
# [7, 8, 9]])
这里,NumPy自动将数组d扩展为一个(3,3)的数组,以便完成加法运算。
在广播运算时,可以使用以下规则:
- 数组的形状通过在数组的末尾添加新的轴来扩展。
- 如果扩展之后,数组的形状仍然不匹配,则会在形状值为1的数组维度上进行扩展,直到所有维度均匹配为止。
- 如果任何一个数组的形状为0,则会被视为具有长度为1的数组来进行广播。
例如,在以下示例中,数组a和b长度为2和3,当它们进行广播操作时,NumPy将自动从数组a中向右添加一个轴来扩展其形状。
a = np.array([1, 2])
b = np.array([4, 5, 6])
c = a[:, np.newaxis] + b
print(c)
#Output: array([[ 5, 6, 7],
# [ 6, 7, 8]])
在上例中,a[:, np.newaxis]为一个(2,1)形状的二维数组,即一个包含两个元素的列向量。它会被广播为一个(2,3)形状的数组,即包含两行三列的矩阵。
广播功能在NumPy中非常有用,它可以用于诸如映射(mapping)、分块(tiling)和异常值处理等各种操作。它是NumPy中的一个核心特性,在数据预处理和数据清洗等数据科学应用中经常被使用。