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. 数组的形状通过在数组的末尾添加新的轴来扩展。
  2. 如果扩展之后,数组的形状仍然不匹配,则会在形状值为1的数组维度上进行扩展,直到所有维度均匹配为止。
  3. 如果任何一个数组的形状为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中的一个核心特性,在数据预处理和数据清洗等数据科学应用中经常被使用。