zoukankan      html  css  js  c++  java
  • Numpy 系列(八)- 广播机制

     什么是广播

    我们都知道,Numpy中的基本运算(加、减、乘、除、求余等等)都是元素级别的,但是这仅仅局限于两个数组的形状相同的情况下。

    可是大家又会发现,如果让一个数组加1的话,结果时整个数组的结果都会加1,这是什么情况呢?

    x = np.arange(3)
    x
    Out[225]: array([0, 1, 2])
    x + 1
    Out[226]: array([1, 2, 3])

    其实这就是广播机制:Numpy 可以转换这些形状不同的数组,使它们都具有相同的大小,然后再对它们进行运算。给出广播示意图:

        广播示例

    接下来我们通过实际代码验证下:

    a = np.arange(0, 40, 10)
    a.shape
    Out[228]: (4,)
    a
    Out[229]: array([ 0, 10, 20, 30])
    b = np.array([0,1,2])
    b.shape
    Out[231]: (3,)
    b
    Out[232]: array([0, 1, 2])
    a = a[:, np.newaxis] # 转换a的维度(形状)
    a.shape
    Out[234]: (4, 1)
    a
    Out[235]: 
    array([[ 0],
           [10],
           [20],
           [30]])
    a + b
    Out[236]: 
    array([[ 0,  1,  2],
           [10, 11, 12],
           [20, 21, 22],
           [30, 31, 32]])
    

     明显可以看出,相加前 a 的形状为 (4, 1), b 的形状为 (3, ), a+b 的结果的形状为(4, 3)。计算时,变换结果与上图类似,这里来详细介绍下:

    a
    Out[237]: 
    array([[ 0],
           [10],
           [20],
           [30]])
    a2 = np.array(([i * 3 for i in a.tolist()]))  # 会先将a转化为a2
    a2
    Out[239]: 
    array([[ 0,  0,  0],
           [10, 10, 10],
           [20, 20, 20],
           [30, 30, 30]])
    b
    Out[240]: array([0, 1, 2])
    b2 = np.array([b.tolist()] * 4) # 再将b转为b2
    b2
    Out[242]: 
    array([[0, 1, 2],
           [0, 1, 2],
           [0, 1, 2],
           [0, 1, 2]])
    a2 + b2
    Out[243]: 
    array([[ 0,  1,  2],
           [10, 11, 12],
           [20, 21, 22],
           [30, 31, 32]])
    

      

  • 相关阅读:
    DispatcherServlet?
    解释内存中的栈(stack)、堆(heap)和方法区(method area)的用法?
    面向对象的特征有哪些方面?
    服务调用是阻塞的吗?
    构造器Constructor是否可被override?
    迭代器和枚举之间的区别?
    Kafka 判断一个节点是否还活着有那两个条件?
    数据传输的事务定义有哪三种?
    mq 的缺点 ?
    如何获取 topic 主题的列表?
  • 原文地址:https://www.cnblogs.com/zhangyafei/p/10567474.html
Copyright © 2011-2022 走看看