numpy 的数组相加、相减以及相乘运算都是对应元素之间的操作,当两个数组大小完全相同的情况下很好想象。
广播的原则:如果两个数组的后缘维度(trailing dimension,即从末尾开始算起的维度)的轴长度相符,或其中的一方的长度为1,则认为它们是广播兼容的。广播会在缺失和(或)长度为1的维度上进行。
这是后缘维度相同的情况 2*2*3 3 广播在缺失的维度进行
x = np.array([[2,2,3],[1,2,3]])
y = np.array([[1,1,3],[2,2,4]])
print(x * y)
[[ 2 2 9]
[2 4 12]]
x = np.array([[[10,11,12],[13,14,15]],
[[10,11,12],[13,14,15]]])
y = np.array([1,1,1])
print(x + y)
[[[11 12 13]
[14 15 16]]
[[11 12 13]
[14 15 16]]]
这是最后一个维度长度为1 4*3 和4*1 广播在长度为1的维度上进行。 此时其他维度必须相同或者不存在。
x = np.array([[0, 0, 0],[1, 1, 1],[2, 2, 2], [3, 3, 3]])
y = np.array([[1],[2],[3],[4]])
print(x + y)
[[1 1 1]
[3 3 3]
[5 5 5]
[7 7 7]]
x = np.array([[[0, 0, 0], [1, 1, 1]],
[[2, 2, 2], [3, 3, 3]]])
y = np.array([[1], [1]])
[[[1 1 1]
[2 2 2]]
[[3 3 3]
[4 4 4]]]
如这个: 2*2*3 和2*1 行!
2*2*3 和4*1 不行!
对于进行广播的张量,对应的每个维度的大小要么相等,要么其中一个维度的大小为 1。如果两个张量的维度大小相等,则它们可以直接运算。如果一个维度的大小为 1,则该维度会在运算中被复制扩展为与另一个张量相同的大小。
如果两个张量的形状在某个维度之前的维度大小完全相等,而在此之后的维度大小要么相等要么为 1,那么这两个张量可以通过广播进行元素级操作。
现在看看更清晰了。