我整理的一些关于Python的项目学习资料+视频(附讲解~~)和大家一起分享、学习一下:
https://d.51cto.com/wO38C1
2.15 Python 中的广播 Broadcasting in Python
观察上图。
这是一个不同食物(每100g)中不同营养成分的卡路里含量表格,表格为3行4列。
现在想要计算不同食物中不同营养成分中的卡路里百分比。
以计算苹果中的碳水化合物卡路里百分比含量为例。
首先计算苹果(100g)中三种营养成分卡路里总和56+1.2+1.8 = 59,然后用56/59 = 94.9%算出结果。可以看出苹果中的卡路里大部分来自于碳水化合物,而牛肉则不同。
对于其他食物,计算方法类似。先按列求和,得到每种食物的三种营养成分总和,然后分别用不同营养成分的卡路里数量除以总和,计算百分比。
问题来了,是否可以不用显示的for循环完成所有计算?
我们把上面的表格等于 3 x 4 的矩阵A。然后用1行代码对列求和,得到4个数字,表示4种食物的卡路里总量。最后用第二行代码把每个元素都除以对应的列之和,得到每种食物每种营养成分的百分比。
代码如下
运行结果
注意: A.sum(axis = 0),axis表示沿着哪个轴求和。0表示是垂直的,也就是列;1表示水平的,也就是行。
percentage=100*A/cal.reshape(1,4)则调用了numpy中的广播机制。
这里使用3x4的矩阵A除以 1x4 的矩阵cal。从技术上说,执行第一行代码后,变量cal已经是一个1x4矩阵了,不需要reshape(重塑)成1x4,似乎有点多余。但是,当我们写代码时不确定矩阵维度(尺寸)的时候,通常会对矩阵进行重塑来确保得到我们想要的(正确的)列向量或行向量。
reshape是一个常用时间的操作,时间复杂度是O(1),它的调用代价极低。不要害怕使用reshape来得到你需要的矩阵形状。
现在的问题是,你怎么让一个3x4的矩阵除以1x4的矩阵呢?
例1
如上图。在python中,当一个 4x1 的列向量与一个常数做加法时,实际上会将常数扩展为一个 4x1 的列向量,然后两者做逐元素加法,结果就是右边的这个向量。这种广播机制对于行向量和列向量均可以使用。前面介绍逻辑回归时候曾经说过,常数b也是这样扩展的。
例2
再看上图。用一个 2x3 的矩阵和一个 1x3 的矩阵相加,或者扩展到一般情况,让一个m x n的矩阵和一个1 x n的矩阵相加。python把1xn的矩阵复制m次,把它变成一个m x n的矩阵。所以,上图中1x3的矩阵会变成2x3的矩阵,然后再和第一个的2x3矩阵逐个元素相加。这里就和我们计算percentage时候处理方法完全一样了,只不过计算percentage用的是除法。
例3
如上图。这里相当于是一个 2x3 或者说m x n 的矩阵加上一个 2x1 或者说m x 1的矩阵。在进行运算时,会先将m x 1矩阵水平复制n次,变成一个 m x n的矩阵,然后再逐个元素相加。
总结:python中广播的通用规则
对于1个m x n的矩阵,如果要加减乘除1个 1 x n的矩阵,python首先会把1 x n的矩阵复制m次(按行复制),变成一个m x n的矩阵,然后逐个元素加减乘除。对于1个m x n的矩阵,如果要加减乘除1个 m x 1的矩阵,python首先会把m x 1的矩阵复制n次(按列复制),同样变成一个m x n的矩阵,然后逐个元素加减乘除。对于1个m x 1的矩阵(列向量),如果要加减乘除1个实数,那就是把实数复制m次,得到另外1个m x 1的矩阵,然后逐个元素加减乘除对于1个1 x n的矩阵(行向量),如果要加减乘除1个实数,那就是把实数复制n次,得到另外1个1 x n的矩阵,然后逐个元素加减乘除在numpy文档中搜索broadcasting可以获得详细说明。
习惯用Matlab/Octave 编程的人,可能会用有类似功能的函数bsxfun。不过NN只需要python就可以了。
整理的一些关于Python的项目学习资料+视频(附讲解~~),需要自取
https://d.51cto.com/wO38C1
本文章为转载内容,我们尊重原作者对文章享有的著作权。如有内容错误或侵权问题,欢迎原作者联系我们进行内容更正或删除文章。
赞 收藏 评论 举报相关文章