鱼C论坛

 找回密码
 立即注册
查看: 2396|回复: 3

[技术交流] 科学计算 神经网络 深度学习 Numpy 【6】广播

[复制链接]
发表于 2017-7-20 22:39:08 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 MSK 于 2017-7-20 22:38 编辑



广播







                               
登录/注册后可看大图



我们要说的可不是这个广播~




先看一段代码:

先创建一个二维数组a,其shape为(6,1):

  1. >>> a = np.arange(0, 60, 10).reshape(-1, 1)
  2. >>> a
  3. array([[ 0], [10], [20], [30], [40], [50]])
  4. >>> a.shape
  5. (6, 1)
  6. #再创建一维数组b,其shape为(5,):

  7. >>> b = np.arange(0, 5)
  8. >>> b
  9. array([0, 1, 2, 3, 4])
  10. >>> b.shape
  11. (5,)
  12. #计算a和b的和,得到一个shape为(6,5)的数组:

  13. >>> c = a + b
  14. >>> c
  15. array([[ 0,  1,  2,  3,  4],
  16.        [10, 11, 12, 13, 14],
  17.        [20, 21, 22, 23, 24],
  18.        [30, 31, 32, 33, 34],
  19.        [40, 41, 42, 43, 44],
  20.        [50, 51, 52, 53, 54]])
  21. >>> c.shape
  22. (6, 5)
复制代码



我也是xxxx,这算法是他体育老湿教的?



其实,在两个数组不同时,numpy会对其进行广播处理~


广播法则:
1.让所有输入数组都向其中shape最长的数组看齐,shape中不足的部分都通过在前面加1补齐
2.输出数组的shape是输入数组shape的各个轴上的最大值
3.如果输入数组的某个轴和输出数组的对应轴的长度相同或者其长度为1时,这个数组能够用来计算,否则出错
4.当输入数组的某个轴的长度为1时,沿着此轴运算时都用此轴上的第一组值




处理过程(来源于网络~)

tips:    repeat方法用法
由于a和b的shape长度(也就是ndim属性)不同,根据规则1,需要让b的shape向a对齐,于是将b的shape前面加1,补齐为(1,5)。相当于做了如下计算:

>>> b.shape=1,5
>>> b
array([[0, 1, 2, 3, 4]])
这样加法运算的两个输入数组的shape分别为(6,1)和(1,5),根据规则2,输出数组的各个轴的长度为输入数组各个轴上的长度的最大值,可知输出数组的shape为(6,5)。

由于b的第0轴上的长度为1,而a的第0轴上的长度为6,因此为了让它们在第0轴上能够相加,需要将b在第0轴上的长度扩展为6,这相当于:

>>> b = b.repeat(6,axis=0)
>>> b
array([[0, 1, 2, 3, 4],
       [0, 1, 2, 3, 4],
       [0, 1, 2, 3, 4],
       [0, 1, 2, 3, 4],
       [0, 1, 2, 3, 4],
       [0, 1, 2, 3, 4]])
由于a的第1轴的长度为1,而b的第一轴长度为5,因此为了让它们在第1轴上能够相加,需要将a在第1轴上的长度扩展为5,这相当于:

>>> a = a.repeat(5, axis=1)
>>> a
array([[ 0,  0,  0,  0,  0],
       [10, 10, 10, 10, 10],
       [20, 20, 20, 20, 20],
       [30, 30, 30, 30, 30],
       [40, 40, 40, 40, 40],
       [50, 50, 50, 50, 50]])
经过上述处理之后,a和b就可以按对应元素进行相加运算了。



不过注意,用我自己的话说,进行运算的数组如果行数 ≠ 列数的话,numpy会报错~

  1. >>> a = np.array([[1,2,3]])
  2. >>> a = np.array([[1,2,3]])#行数 == 3
  3. >>> b = np.array([[1],[2],[3]])#列数 == 3
  4. >>> a + b
  5. array([[2, 3, 4],
  6.        [3, 4, 5],
  7.        [4, 5, 6]])
  8. >>> a * b
  9. array([[1, 2, 3],
  10.        [2, 4, 6],
  11.        [3, 6, 9]])
  12. >>> c = np.array([[17,8]])
  13. >>> a + c
  14. Traceback (most recent call last):
  15.   File "<pyshell#89>", line 1, in <module>
  16.     a + c
  17. ValueError: operands could not be broadcast together with shapes (1,3) (1,2)
  18. >>> a * c
  19. Traceback (most recent call last):
  20.   File "<pyshell#90>", line 1, in <module>
  21.     a * c
  22. ValueError: operands could not be broadcast together with shapes (1,3) (1,2)
复制代码




.ogird
返回的是一组可以用来广播计算的数组~

语法:np.ogrid[初始值,终始值,长度j]


注意!!!


ogrid不是函数!!!
ogrid不是函数!!!
ogrid不是函数!!!

  1. >>> x,y = np.ogrid[0:5,0:5]
  2. >>> x
  3. array([[0],
  4.        [1],
  5.        [2],
  6.        [3],
  7.        [4]])
  8. >>> y
  9. array([[0, 1, 2, 3, 4]])
复制代码

  1. >>> x, y = np.ogrid[0:1:4j, 0:1:3j]
  2. >>> x
  3. array([[ 0.        ],
  4.        [ 0.33333333],
  5.        [ 0.66666667],
  6.        [ 1.        ]])
  7. >>> y
  8. array([[ 0. ,  0.5,  1. ]])
复制代码

评分

参与人数 1鱼币 +6 收起 理由
小甲鱼 + 6

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-7-21 08:08:36 | 显示全部楼层
震惊,,,
还有广播胡什么鬼,,一直在转
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-21 20:34:29 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-3-29 08:58:37 | 显示全部楼层
学完了?。。。感觉科学应该不止这些。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-28 19:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表