NumPy广播


术语 广播 是指在算术运算期间NumPy处理不同形状的数组的能力。数组上的算术运算通常在相应的元素上完成。如果两个阵列具有完全相同的形状,那么这些操作将顺利执行。

例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中仍然可以对非相似形状的阵列进行操作。较小的阵列被 广播 到较大阵列的大小,以便它们具有兼容的形状。

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

  • 具有较小 ndim的 数组在其形状上预置为'1'。

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

  • 如果输入的大小与输出大小匹配或者其值恰好为1,则可以使用输入进行计算。

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

如果上述规则产生有效结果并且以下情况之一成立,则称一组数据可以 广播 -

  • 数组的形状完全相同。

  • 数组具有相同的维度数量,每个维度的长度可以是常用长度或1。

  • 尺寸太小的阵列可能会将其形状预先设置为长度为1的尺寸,以使上述属性为真。

以下程序显示了广播示例。

例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 兼容。

排列