• [开发技巧]·Numpy广播机制的深入理解与应用


    [开发技巧]·Numpy广播机制的深入理解与应用

     

    1.问题描述

    我们在使用Numpy进行数据的处理时,经常会用到广播机制来简化操作,例如在所有元素都加上一个数,或者在某些纬度上作相同的操作。广播机制很方便,但是概念却也有些复杂,可能会让一些初学者感到困惑,在使用过程中,产生一些错误。

    本文以实战演练的方式来讲解广播机制的概念与应用,不仅仅适用于Numpy,在TensorFlow,PyTorch,MxNet的广播机制中同样适用。

     

    2.原理讲解

    广播机制遵循一下准则:

    1.首先以最长纬度为准拓展为相同纬度大小,有些纬度为零,先变为1,在进行广播。

    2.纬度上从右往左进行匹配,两个数组要么在一个纬度上相同,要么其中一个为1。

    3.各个相匹配纬度上的数据都以此最长的shape为准进行复制对齐。

     

    3.实战演练

    >>> import numpy as np
    >>> num1 = np.array(3)
    >>> num1.shape
    ()
    >>> al = np.ones([1,3])
    >>> bl = np.ones([4,1])*2
    >>> al
    array([[1., 1., 1.]])
    >>> bl
    array([[2.],
           [2.],
           [2.],
           [2.]])
    

    我们新建了一些数据,其中num1是一个标量,纬度为0,al与bl都是纬度为2的矩阵

    现在我们让al+num1

    >>> al_num1 = al+num1
    >>> al_num1
    array([[4., 4., 4.]])

    根据矩阵加法的准则,两个矩阵的形状必须相同,对应元素相加,我们可以求得num1广播操作时,变成了array([[3., 3., 3.]])

    其实就对应上面三个法则,首先这两个数据先进行条件1的操作,num1就变成了array([[3.]]),然后就满足了条件2,被条件3进行了广播。

    再举一个例子,让al+bl,和上面例子类似,al与bl都被拓展为了shape(4,3),大家可以自己根据法则计算推理一遍。

    >>> al_bl = al + bl
    >>> al_bl
    array([[3., 3., 3.],
           [3., 3., 3.],
           [3., 3., 3.],
           [3., 3., 3.]])

    最后举一个不符合的例子

    >>> cl = np.ones([2,2])*3
    >>> cl
    array([[3., 3.],
           [3., 3.]])
    >>> al_cl = al + cl
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    ValueError: operands could not be broadcast together with shapes (1,3) (2,2) 

    为什么此次广播失败了呢,我们可以发现cl与al的最右边第一个纬度,大小既不相等,其中一个也不为1或者0(如果为0也会被拓展为1)。所以无法进行广播。

    Hope this helps

  • 相关阅读:
    Java技术之ThreadLocal的使用
    find and find_by
    vim-config
    把字符串当做js代码执行的方法
    lodop打印设计
    前端使用lodop如何获取打印状态
    lodop第三方插件的使用
    nodejs中http服务器,如何使用GET,POST请求发送数据、npm、以及一些插件的介绍
    nodejs 用http模块搭建的服务器的路由,以及路由代码的重构过程
    nodejs基础 用http模块 搭建一个简单的web服务器 响应JSON、html
  • 原文地址:https://www.cnblogs.com/xiaosongshine/p/10744632.html
Copyright © 2020-2023  润新知