我们在前面的代码中经常见到将矩阵与常数相加的情况,这样的可行性源于Python中的广播机制。在numpy中,当一个 4 × 1 4 times 1 4×1的列向量与一个常数做加法时,实际上会将常数扩展为一个 4 × 1 4 times 1 4×1的列向量,然后两者做逐元素加法。
让我们来看一个不一样一点的例子
[
1
2
3
4
5
6
]
+
[
100
200
]
=
[
101
102
103
204
205
206
]
left[begin{array}{lll} 1 & 2 & 3 \ 4 & 5 & 6 end{array}right]+left[begin{array}{l} 100 \ 200 end{array}right]=left[begin{array}{lll} 101 & 102 & 103 \ 204 & 205 & 206 end{array}right]
[142536]+[100200]=[101204102205103206]
这里相当于是一个 m × n m times n m×n的矩阵加上一个 m × 1 m times 1 m×1的矩阵,在进行运算的时候,会先将 m × 1 m times 1 m×1的矩阵水平复制 n n n次,变成一个 m × n m times n m×n的矩阵,然后执行逐元素加法。
我们绘制图片来说明不同情况下的广播机制(其中虚线格子代表原本为空,但广播复制出来的元素)
Python的特性允许你使用广播功能,这是程序的优点也是缺点。由于广播机制巨大的灵活性,如果你对于广播机智的工作原理这些细节不熟悉的话,就可能产生很细微、很奇怪的bug。例如,你不小心将一个列向量添加到一个行向量中,你以为它会报出维度不匹配或类型错误之类的错误,但实际上你会得到一个列向量和行向量的求和。
吴恩达老师在课中建议到,如果你不完全确定一个向量的维度,不妨多去尝试使用一些断言语句(assertion statement),如assert(a.shape == (5, 1))。



