• 7、numpy——广播


    1、广播的引出

    广播(Broadcast)是 numpy 对不同形状(shape)的数组进行数值计算的方式, 对数组的算术运算通常在相应的元素上进行。

    如果两个数组 a 和 b 形状相同,即满足 a.shape == b.shape,那么 a*b 的结果就是 a 与 b 数组对应位相乘。这要求维数相同,且各维度的长度相同。

    1 >>> import numpy as np
    2 >>> a =np.arange(1,6)
    3 >>> b =np.arange(5,10)
    4 >>> c=a+b
    5 >>> c
    6 array([ 6,  8, 10, 12, 14])
    7 >>>

     对于两个形状不同的数组做运算时应该怎么进行呢?

    广播机制:

      a、广播机制是Numpy(开源数值计算工具,用于处理大型矩阵)里一种向量化数组操作方法。

      b、Numpy的通用函数(Universal functions) 中要求输入的两个数组shape是一致的,当数组的shape不相等的时候,则会使用广播机制,调整数组使得两个shape一致,满足规则,则可以运算,否则就出错。 

    实例:

    1 import numpy as np
    2 a = np.array([[0, 0, 0],
    3               [10, 10, 10],
    4               [20, 20, 20],
    5               [30, 30, 30]])
    6 b = np.array([1, 2, 3], dtype=int)
    7 print(a+b)

    结果:

    [[ 1  2  3]
     [11 12 13]
     [21 22 23]
     [31 32 33]]

    下面的图片展示了数组 b 如何通过广播来与数组 a 兼容。

     4x3 的二维数组与长为 3 的一维数组相加,等效于把数组 b 在二维上重复 4 次再运算

    2、广播的规则

    如果两个数组的后缘维度(trailing dimension,即从末尾开始算起的维度)的轴长度相符,或其中的一方的长度为1,则认为它们是广播兼容的。广播会在缺失和(或)长度为1的维度上进行。

      这句话乃是理解广播的核心。广播主要发生在两种情况,一种是两个数组的维数不相等,但是它们的后缘维度的轴长相符,另外一种是有一方的长度为1。

    2.1 数组维度不同,后缘维度的轴长相符

    1 import numpy as np
    2 arr1 = np.array([[0, 0, 0],
    3                  [1, 1, 1],
    4                  [2, 2, 2],
    5                  [3, 3, 3]])  #arr1.shape = (4,3)
    6 arr2 = np.array([1, 2, 3])    #arr2.shape = (3,)
    7 arr_sum = arr1 + arr2 # 后缘维度相同都为3
    8 print(arr1.shape, arr2.shape)
    9 print(arr_sum)

    执行结果:

    (4, 3) (3,)
    [[1 2 3]
     [2 3 4]
     [3 4 5]
     [4 5 6]]

    上例中arr1的shape为(4,3),arr2的shape为(3,)。可以说前者是二维的,而后者是一维的。但是它们的后缘维度相等,arr1的第二维长度为3,和arr2的维度相同。arr1和arr2的shape并不一样,但是它们可以执行相加操作,这就是通过广播完成的,在这个例子当中是将arr2沿着0轴进行扩展。

      上面程序当中的广播如下图所示:

    同样的例子还有:

    从上面的图可以看到,(3,4,2)和(4,2)的维度是不相同的,前者为3维,后者为2维。但是它们后缘维度的轴长相同,都为(4,2),所以可以沿着0轴进行广播。

      同样,还有一些例子:(4,2,3)和(2,3)是兼容的,(4,2,3)还和(3)是兼容的,后者需要在两个轴上面进行扩展。

    2.2 数组维度相同,其中有个轴为1

    1 import numpy as np
    2 arr1 = np.array([[0, 0, 0],[1, 1, 1],[2, 2, 2], [3, 3, 3]])  #arr1.shape = (4,3)
    3 arr2 = np.array([[1],[2],[3],[4]])    #arr2.shape = (4, 1)
    4 arr_sum = arr1 + arr2
    5 print(arr_sum)

    执行结果:

    [[1 1 1]
     [3 3 3]
     [5 5 5]
     [7 7 7]]

    arr1的shape为(4,3),arr2的shape为(4,1),它们都是二维的,但是第二个数组在1轴上的长度为1,所以,可以在1轴上面进行广播,如下图所示:

    在这种情况下,两个数组的维度要保证相等,其中有一个轴的长度为1,这样就会沿着长度为1的轴进行扩展。这样的例子还有:(4,6)和(1,6) 。(3,5,6)和(1,5,6)、(3,1,6)、(3,5,1),后面三个分别会沿着0轴,1轴,2轴进行广播。

      后话:还有上面两种结合的情况,如(3,5,6)和(1,6)是可以相加的。在TensorFlow当中计算张量的时候也是用广播机制,并且和numpy的广播机制是一样的。

  • 相关阅读:
    .NET Framework 4 不能先解压再使用setup.exe安装的解决方法
    PNG透明度兼容IE6的方法
    VM虚拟机访问宿主机本地站点
    AU3设置非全局快捷键的函数GUISetAccelerators
    Attempted to serialize java.lang.Class: org.hibernate.proxy.HibernateProxy. Forgot to register a type adapter?
    关于Android Studio gradle build running很久的问题
    不懂积累,你怎么成长
    关于ScrollView里的显示不完问题
    关于DialogFragment里控件无法赋新值问题
    Android上传Base64图片,图片变成黑色一块的问题
  • 原文地址:https://www.cnblogs.com/weststar/p/11574451.html
Copyright © 2020-2023  润新知