numpy的广播机制旨在提供一种当被处理数组维度大小不一样时仍然能计算的机制。首先要明白,在数组(或者说是向量,数组的本质就是多维向量的组合)计算时,除了一些特殊的计算(点乘等),其他操作都是元素一一对应的操作,它要求被处理的数组的维度以及每个维度大小相等。但是,许多计算中,想要一个维度对其他所有维度操作,此时被操作的数组的大小不一样,但numpy采用广播机制来处理这个问题。
import numpy as np
a = np.arange(16)
a.shape=(4,4)
print('a 数据为:',a)
b = np.array([1,2,3,4])
print('b 数组为:',b)
print('a+b 的结果是:',a+b)
输出结果:
a 数据为:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]]
b 数组为: [1 2 3 4]
a+b 的结果是:
[[ 1 3 5 7]
[ 5 7 9 11]
[ 9 11 13 15]
[13 15 17 19]]
事实上,它是把b变成a的维度大小,也就是将[1,2,3,4] 复制4次并增加一个维度:
[[1 2 3 4]
[1 2 3 4]
[1 2 3 4]
[1 2 3 4]]
再与a对应元素相加。
同样,我们把加变为乘(这里的乘是叉乘,对应元素的乘积)
import numpy as np
a = np.arange(16)
a.shape=(4,4)
print('a 数据为:',a)
b = np.array([1,2,3,4])
print('b 数组为:',b)
print('a*b 的结果是:',a*b)
输出:
a 数据为:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]]
b 数组为: [1 2 3 4]
a*b 的结果是:
[[ 0 2 6 12]
[ 4 10 18 28]
[ 8 18 30 44]
[12 26 42 60]]
最后,说一说numpy广播机制的原理,如图所示:
在操作的过程中,先把小维度的数据变为大维度数组的维度,图中将b的第一行复制4次组成与a一样的大小再操作。
notes 在实际使用中需要灵活使用,但同时也要注意该机制可能带来的误操作,例如代码写错但仍能得到结果。