numpy的broadcast是怎么做的
其实大概是有下面4个原则.
怎么判断能不能进行broadcast?
从后往前对齐, 要么相同, 要么其中有一个是1. 官网上给了好几个例子. 比如3*1与1*4, 满足. 但如果是3*2与1*4, 那不行. 因为2与4不相同, 而且没有一个是1. 这个地方要是我说的不明白, 建议看官方文档给的例子.
如果ndim不同怎么办?
如果维数不同, 短的前面全补上1使得ndim相同, 比如说, 一个是2*3*4, 一个是4, 那么后者维数更少, 前面全补上1, 也就是1*1*4.
broadcast后的形状如何?
在做了上一步补齐ndim后, 每一个取max. 比如1*3与4*1. 那么就是(max(1,4),max(3,1)), 是(3,4).
如果满足对齐规则, 怎么对齐?
从右往左遇到的第一个1, 它右边有几维就跳出几层括号再开始拷贝, 并且是不带括号的拷贝. 画图吧.
quiz: 怎么用broadcast得到每行相同/每列相同的矩阵?
每行相同, 那么相当于是退了一层括号拷贝的, 那么1应该是出现在第1维(就是axis=0), 那么其实可以直接是向量. 每列相同, 那么没有退括号, 应该是列矩阵.
quiz: 怎么得到outer sum? a,b=np.arange(1,5),np.arange(3,5)
, 想要4*2的矩阵.
c[i][j]=a[i]+b[j], a需要broadcast为每列相同的, b需要为每行相同的矩阵. 因此如上说是a[,np.newaxis]+b
.