Numpy 简明教程

NumPy - Broadcasting

术语 broadcasting 指的是 NumPy 在算术运算期间处理不同形状的数组的能力。数组上的算术运算通常在对应元素上执行。如果两个数组的形状完全相同,那么这些运算就会顺畅执行。

Example 1

import numpy as np

a = np.array([1,2,3,4])
b = np.array([10,20,30,40])
c = a * b
print c

它的输出如下:

[10   40   90   160]

如果两个数组的维度不同,则逐元素运算是不可能的。然而,由于广播功能,NumPy 中仍然可以对形状不相同的数组进行运算。较小的数组会被 broadcast 为较大数组的大小,以便它们具有兼容的形状。

如果满足以下规则,广播是可能的 −

  1. 具有比另一个 ndim 小的数组在其形状中在前面添加“1”。

  2. 输出形状中每个维度的大小是该维度中输入大小的最大值。

  3. 如果输入的大小与输出大小匹配或者其值为 1,则可以在计算中使用输入。

  4. 如果输入的维度大小为 1,则该维度中的第一个数据条目将用于沿该维度进行的所有计算。

如果上述规则产生了有效的结果,并且满足以下条件之一,则一组数组被称作 broadcastable

  1. 数组具有完全相同的形状。

  2. 数组具有相同数量的维度,并且每个维度的长度要么是公共长度,要么是 1。

  3. 维度太少的数组可以在其形状前面添加一个长度为 1 的维度,以使上述属性为真。

以下程序展示了一个广播示例。

Example 2

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