码迷,mamicode.com
首页 > 其他好文 > 详细

numpy的broadcast是怎么做的

时间:2021-01-05 11:21:36      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:就是   而且   技术   网上   org   遇到   括号   image   asics   

其实大概是有下面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, 它右边有几维就跳出几层括号再开始拷贝, 并且是不带括号的拷贝. 画图吧.
技术图片

例子

文档上的例子, 256*256*3, 最后这个3是rgb向量, 希望每一rgb颜色乘以一个向量. 怎么搞? 直接乘以这个向量(ndim=1)就行了, 首先相当于1*1*3, 然后先拷贝内层再拷贝外层(实际上numpy并没有拷贝, 我也不懂, 文档就是这么说的, 为了理解上的一致性).

那么a[i,j,:]*b[i,j,:]右边这个都一样, i,j随便怎么取都一样.

再比如, outer sum, 直接一个行向量, 一个列向量相加就行了.

quiz: 怎么用broadcast得到每行相同/每列相同的矩阵?

每行相同, 那么相当于是退了一层括号拷贝的, 那么1应该是出现在第1维(就是axis=0), 那么其实可以直接是向量. 每列相同, 那么没有退括号, 应该是列矩阵.

numpy的broadcast是怎么做的

标签:就是   而且   技术   网上   org   遇到   括号   image   asics   

原文地址:https://www.cnblogs.com/Tokubara/p/14221090.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!