• numpy 中的 broadcasting 理解


    broadcast 是 numpy 中 array 的一个重要操作。

    首先,broadcast 只适用于加减。

    然后,broadcast 执行的时候,如果两个 array 的 shape 不一样,会先给“短”的那一个,增加高维度“扩展”(broadcasting),比如,一个 2 维的 array,可以是一个 3 维 size 为 1 的 3维 array。

    类似于: shape(1,3,2) = shape(3,2)

    最后,比较两个 array(扩展后的),按照 dimension 从低到高,比较每一个维度的 size 是否满足下面两个条件之一:

    1. 相等

    2. 其中一个为 1

    所以,举例,下列 array 是否可以进行 broadcast:

    1. shape(4, 3) 与 shape(3,) :shape(3) 可以 broadcast 为 shape(1, 3),那么,从低到高: d0(3 === 3), d1(其中一个为 1)。结论,可以,结果的为 shape(4, 3)

    2. shape(6,5,4,3, 与 shape(5, 4, 3):shape(5, 4, 3) 可以 broadcast 为 shape(1,5,4,3),那么,从低到高:d0( 3 === 3), d1(4 === 4), d2(5===5),d3(其中一个为 1)。结论,可以,结果为 shape(6, 5, 4, 3)。

    3. shape(2,3) 与 shape(5,4,3):shape(2,3) 可以 broadcast 为 shape(1, 2, 3),那么,从低到高:d0( 3 == 3), d1(4!=2)。结论,不能进行 broadcast。

    4. shape(4,1) 与 shape(5):shape(5)可以 broadcast 为 shape(1,5),那么,从低到高: d0( 其中一个为 1), d1(其中一个为 1)。结论,可以进行 broadcast,结果为 shape(4, 5) 。

    broadcast 之后的运算是怎样呢?举例说明:

    a = [ [0,1,2,3], [4,5,6,7] ]
    
    b = [1,2,3,4]
    
    a + b = [ [1,3,5,7], [5,7,9,11] ]

     或可自己运行下面代码观察

    import numpy as np
    
    a = np.arange(12)
    b = a.reshape(3,2,2)
    
    c = np.arange(4)
    d = c.reshape(2, 2)
    
    e = np.arange(2)
    
    print d+b
    
    print e+b

    还有下面一种特殊情况,即扩展低维度为 1 的情况下:

    import numpy as np 
    
    a = np.arange(3)
    
    b = np.arange(5)
    
    a = a[:, np.newaxis]
    
    print a
    print b
    
    print a+b

    基本上是只在对应的 dimension 进行加减,扩展的部分不参与运算。

  • 相关阅读:
    conda docker镜像
    知识图谱推理与实践 (2) -- 基于jena实现规则推理
    知识图谱推理与实践(1)
    Docker使用mysqldump命令备份导出mysql容器中的数据
    centos sudo ps查找并kill线程
    使用Docker安装mysql,挂载外部配置和数据
    使用rpm命令查看软件是否安装,卸载、安装软件
    mysql too many connection
    mysql timeout的详细介绍
    git创建/删除本地branch(分支),tag(标签)
  • 原文地址:https://www.cnblogs.com/pied/p/8288856.html
Copyright © 2020-2023  润新知