数据分析手册--numpy数组(4)--python中的广播

    1. 数组的计算:广播(broadcasting)

    前面我们介绍了numpy如何通过通用函数的向量化操作来减少缓慢的python循环.

    另外一种向量化操作的方法是利用numpy的广播功能.

    例如:广播可以允许一个标量(可以认为是一个0维的数组)直接和一个数组相加

    import numpy as np
    a=np.arange(0,5)
    a=a+5
    print(a)
    
    # the output will be [5,6,7,8,9]
    

    其工作的过程就是数值5会被扩展或重复至数组[5,5,5],然后执行加法.Attention!,numpy的广播功能也就是这种对值的重复实际上并没有发生,但是这是一种很好的理解广播的方式.

​ 我们当然可以将这种原理扩展到更高维度的数组,例如将一个一维数组和一个二维数组相加.

​ 这里我们举一个更加复杂的例子,两个数组的同时广播,例如以下示例:

a=np.arange(3)
b=np.arange(3)[:, np.newaxis]
a+b
image-20201130221802556

这里a和b都进行了扩展来匹配一个公共的形状,最终的结果是一个二维数组,这里我还是想强调一句,广播并不会真实地引起格外内存的增加与分配,只是这样更为方便我们去理解。–广播功能的具体实现可以去查看官方文档

  1. 广播的规则–决定两个数组间的操作

    1. 如果两个数组的维度数不相同,那么小维度数组的形状将会在最左边补1.

    2. 如果两个数组的形状在任何一个维度上都不匹配,那么数组的形状会沿着维度为1的维度扩展以匹配另外一个数组的形状.

    3. 如果两个数组的形状在任何一个维度上都不匹配并且没有任何一个维度等于1,那么会引发异常.

      对于规则3,这里我们举一个特殊例子来描述两个数组不兼容会发生的异常情况.

      M=np.ones((3,2))
      a=np.arange(3)
      
      #output
      M.shape=(3,2)
      a.shape=(3,)
      #规则1
      M.shape->(3,2)
      a.shape->(1,3)
      #规则2
      M.shape->(3,2)
      a.shape->(3,3)
      #现在用到规则3-最终的形状还是不匹配,因此这两个数组是不兼容的
      

      attention! 这里容易发生混淆的事:你可能想在a数组的右边补1,而不是左边补1,让a和M的维度变得兼容,但是这不被广播的规则所允许,这种灵活性容易导致结果和规则的混乱,如果你想试试右边补全,建议使用numpy的newaxis关键字也就是变形数组来实现

      a[:, np.newaxis].shape
      #outout
      (3,1)
      M+a[:, np.newaxis]
      #这样就能够实现两个数组相加了
      

      还需要注意的事,广播规则对于任意的二进制通用函数都是适用的。例如logaddexp(a,b),该函数计算会比直接计算log(exp(a)+exp(b))更加准确。

猜你喜欢

转载自blog.csdn.net/weixin_45870904/article/details/110409619
今日推荐