前言
numpy 很好的支持向量和矩阵的运算,broadcast 它很灵活和智能,有时它会自动帮我们完成一些事情。
先来个直观的认识
import numpy as np
a=np.array([[1,2,3],[4,5,6]])
b=np.array([[1,1,1],[1,1,1]])
print(a+b)
输出:
[[2 3 4]
[4 5 6]]
a和b都是2x3的矩阵,把他们相加,numpy让各个元素分别相加。这个很正常。
如果 b=[1,2,3]会怎么呢?
import numpy as np
a=np.array([[1,2,3],[4,5,6]])
b=np.array([1,2,3])
print(a)
print(b)
print(a+b)
先跑一波看看:
[[1 2 3]
[4 5 6]]
[1 2 3]
[[2 4 6]
[5 7 9]]
结果是一个2x3的矩阵。
奇怪啦,这是怎么做到的呢?a是一个2x3的矩阵,而b是一个1x3的矩阵。讲道理,这个是不能相加的哎╮(╯▽╰)╭。这个结果是什么来的?
我们让c=a+b,输出c-a看看:
import numpy as np
a=np.array([[1,2,3],[4,5,6]])
b=np.array([1,2,3])
c=a+b
print(c-a)
输出:
[[1 2 3]
[1 2 3]]
interesting ,b原先是一个1x3的矩阵,现在扩展成为:2x3的矩阵。具体的做法是将第一行数据复制到第二行去。
这就是broadcast做的一个处理。
broadcast
当参与运算的两个矩阵的大小不一致的时候怎么办嘞?broadcast 告诉你 怎么办。就像上面的例子显示的那样。
通常 numpy的操作都是两个矩阵的对应位置元素依次操作,比如上面的a+b,就是cij=aij+bij。一般来说两个操作数需要是相同的形状,但是numpy的broadcast机制让这个限制条件稍微宽松一下,但是也依然得满足某些条件。
条件就是:
设A是nxm矩阵,B是pxq矩阵。A,B可参与逐元素的numpy运算当且仅当
1.n=p且m=q 或
2.n=p,m或q为1;或
3.n或p为1,m=q.或
4.n=p=1或m=q=1.
如果这些条件都不满足,则报错。
broadcast的结果max(n,p)xmax(m,q)的矩阵。