NumPy - 广播



NumPy 广播

NumPy 中的广播是指通过自动扩展较小数组的形状以匹配较大数组的形状来对不同形状的数组执行运算的能力。这在执行算术运算或将函数应用于不同维度的数组时非常有用。

在执行算术运算时,NumPy 对数组的对应元素进行运算。如果数组具有相同的形状,则可以顺利地执行运算。但是,如果数组具有不同的形状,则 NumPy 使用广播来对齐它们,从而可以轻松地进行元素级运算。

广播规则

为了使广播起作用,必须满足以下规则:

  • 如果数组具有不同的维度数,则较小维度数组的形状将在左侧填充 1,直到两个形状具有相同的长度。
  • 每个维度的尺寸必须相同,或者其中一个必须为 1。
  • 广播从最后一个维度应用到第一个维度。

例如,考虑两个形状为(3, 4)(4,)的数组。广播规则将如下对齐形状:

  • 填充较小数组的形状:较小数组的形状 (4,) 被填充为 (1, 4)。

  • 对齐维度:形状 (3, 4) 和 (1, 4) 分别对齐为 (3, 4) 和 (3, 4)。

  • 执行元素级运算:运算应用于对齐的形状。

向数组添加标量

当向数组添加标量时,NumPy 使用广播将标量应用于数组的每个元素。广播扩展标量以匹配数组的形状,从而实现元素级运算。

示例

在以下示例中,我们将标量“10”广播到数组的每个元素,导致每个元素增加 10:

import numpy as np

# Creating an array
array = np.array([[1, 2, 3], [4, 5, 6]])

# Adding a scalar
result = array + 10
print(result)

以下是获得的输出:

[[11 12 13][14 15 16]]

添加不同形状的数组

当添加不同形状的数组时,NumPy 应用广播规则使它们的形状兼容。广播通过将较小数组扩展到较大数组上起作用,以便两个数组具有相同的形状以进行元素级加法。

此过程无需在执行运算之前手动重新整形数组。

示例 1

在此示例中,我们将第二个数组“array2”广播以匹配第一个数组“array1”的形状:

import numpy as np

# Creating two arrays with different shapes
array1 = np.array([[1, 2, 3], [4, 5, 6]])     
array2 = np.array([10, 20, 30])              

# Adding arrays with broadcasting
result = array1 + array2
print(result)

这将产生以下结果:

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

示例 2

以下是另一个在 NumPy 中广播两个不同形状数组的示例:

import numpy as np 
a = np.array([[0.0,0.0,0.0],[10.0,10.0,10.0],[20.0,20.0,20.0],[30.0,30.0,30.0]]) 
b = np.array([1.0,2.0,3.0])  
   
print ('First array:') 
print (a) 
print ('\n') 
   
print ('Second array:')
print (b)
print ('\n')
   
print ('First Array + Second Array')
print (a + b)

此程序的输出如下:

First array:
[[ 0.  0.  0.]
 [10. 10. 10.]
 [20. 20. 20.]
 [30. 30. 30.]]


Second array:
[1. 2. 3.]


First Array + Second Array
[[ 1.  2.  3.]
 [11. 12. 13.]
 [21. 22. 23.]
 [31. 32. 33.]]

下图演示了如何广播数组b以使其与a兼容。

array

使用多维数组进行广播

在对具有不同形状的多维数组执行运算时,广播规则会对齐它们的维度,以便可以对它们进行元素级运算。

此过程涉及扩展较小数组以匹配较大数组的形状,从而可以顺利地执行运算。

示例

在以下示例中,我们创建了两个 3D 数组,然后使用广播将它们相加:

import numpy as np

# Creating two 3D arrays
array1 = np.ones((2, 3, 4))                    
array2 = np.arange(4)                        

# Adding arrays with broadcasting
result = array1 + array2
print(result)

以下是上述代码的输出:

[[[1. 2. 3. 4.]
  [1. 2. 3. 4.]
[1. 2. 3. 4.]]

 [[1. 2. 3. 4.]
  [1. 2. 3. 4.]
  [1. 2. 3. 4.]]]

使用广播应用函数

广播不仅简化了不同形状数组之间的算术运算,还允许跨数组应用函数。这些函数可以包括:

  • 数学函数:执行数学运算的函数,例如加法、减法、乘法和除法。

  • 统计函数:计算统计属性的函数,如平均值、中位数、方差和标准差。

  • 归约函数:通过执行求和、乘积或最大值等运算来减少数组维度的函数。

  • 逻辑运算:执行逻辑运算的函数,例如比较和逻辑运算(例如,AND、OR、NOT)。

在将函数应用于不同形状的数组时,广播确保函数按元素进行应用。

示例

在此示例中,我们使用 numpy.maximum() 函数对两个数组执行元素级比较。该函数将“array1”的每个元素与“array2”的对应元素进行比较,结果是一个数组,其中每个元素是输入数组中对应元素的最大值:

import numpy as np

# Creating arrays
array1 = np.array([[1, 2, 3], [4, 5, 6]])   
array2 = np.array([[10], [20]])              

# Applying a function with broadcasting
result = np.maximum(array1, array2)
print(result)

执行上述代码后,我们将获得以下输出:

[[10 10 10]
 [20 20 20]]
广告