当前位置 : 主页 > 编程语言 > java >

Broadcast: Numpy中的广播机制

来源:互联网 收集:自由互联 发布时间:2022-06-23
​ 在numpy中,针对两个不同形状的数组进行对应项的加,减,乘,除运算时,会首先尝试采用一种称之为广播的机制,将数组调整为统一的形状,然后再进行运算。先来看一个最基本的

在numpy中,针对两个不同形状的数组进行对应项的加,减,乘,除运算时,会首先尝试采用一种称之为广播的机制,将数组调整为统一的形状,然后再进行运算。先来看一个最基本的广播的例子

>>> import numpy as np
>>> a = np.array([1, 2, 3])
>>> b = 2
>>> a * b
array([2, 4, 6])

上述代码进行矩阵加法运算,numpy在处理时,首先将数组b延伸成为和数组a长度相同的一个数组,示意如下

Broadcast: Numpy中的广播机制_广播机制

然后再对应元素相加,从而实现加法运算。这种将较小数组进行延伸,保持和较大数组同一形状的机制,就称之为广播。

数组的广播是有条件约束的,并不是任意两个不同形状的数组都可以调整成同一形状,其操作逻辑如下

  • 第一步,判断输出结果的数组尺寸,即shape属性,取输入数组的每个轴的最大值
  • 第二步,将shape属性与输出数组不一致的话输入数组进行广播,要求二者之间只可以有一个轴尺寸是不同的,而且必须是1
  • 第三步,利用广播之后的数组进行对应项的算术运算,输出结果
  • 结合以下例子来了解其操作过程

    >>> a = np.arange(4)
    >>> a
    array([0, 1, 2, 3])
    >>> a = np.arange(4).reshape(4, 1)
    >>> a
    array([[0],
    [1],
    [2],
    [3]])
    >>> b = np.arange(5)
    >>> b.shape
    (5,)
    >>> b
    array([0, 1, 2, 3, 4])
    >>> a + b
    array([[0, 1, 2, 3, 4],
    [1, 2, 3, 4, 5],
    [2, 3, 4, 5, 6],
    [3, 4, 5, 6, 7]])

    数组a为二维数组,4行1列,数组b为一组数组,也可以看做是1行5列的二维数组,二者相加,对应的输出数组的行为4行,取数组a的行数,列为5列,取数组b的列数。明确输出结果为4行5列的矩阵之后,将输入的数组a和b通过广播机制扩展为4行5列的数组。

    对于数组a而言,其行数和输出数组相同,列数为1,通过广播机制扩展之后,其他4列和第一列的值一样;对于数组b而言,其列数和输出数组相同,行数为1,扩展之后将其他4行的内容设置为和第一行的内容一样,可以看做是生成了以下两个中间数组

    >>> a = np.array([x for x in range(4) for y in range(5)], order = 'F').reshape(4, 5)
    >>> a
    array([[0, 0, 0, 0, 0],
    [1, 1, 1, 1, 1],
    [2, 2, 2, 2, 2],
    [3, 3, 3, 3, 3]])
    >>> b = np.array([y for x in range(4) for y in range(5)], order = 'C').reshape(4, 5)
    >>> b
    array([[0, 1, 2, 3, 4],
    [0, 1, 2, 3, 4],
    [0, 1, 2, 3, 4],
    [0, 1, 2, 3, 4]])
    >>> a + b
    array([[0, 1, 2, 3, 4],
    [1, 2, 3, 4, 5],
    [2, 3, 4, 5, 6],
    [3, 4, 5, 6, 7]])

    当然实际上并没有生成中间数组,这里引入中间数组只是为了更形象的理解广播机制。再看一个官方的例子加深理解

    >>> a = np.array([x for x in range(0,40,10) for y in range(3)]).reshape(4, -1)
    >>> a
    array([[ 0, 0, 0],
    [10, 10, 10],
    [20, 20, 20],
    [30, 30, 30]])
    >>> b = np.arange(3)
    >>> a + b
    array([[ 0, 1, 2],
    [10, 11, 12],
    [20, 21, 22],
    [30, 31, 32]])

    广播机制的示意图如下

    Broadcast: Numpy中的广播机制_广播机制_02

    如果数组无法无法进行广播,则会报错

    >>> a = np.array([x for x in range(0,40,10) for y in range(3)]).reshape(4, -1)
    >>> a
    array([[ 0, 0, 0],
    [10, 10, 10],
    [20, 20, 20],
    [30, 30, 30]])
    >>> b = np.arange(4)
    >>> b
    array([0, 1, 2, 3])
    >>> a +b
    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    ValueError: operands could not be broadcast together with shapes (4,3) (4,)

    通过广播机制,在处理数组按位运算时,可以使得代码更加简洁,同时相比循环处理,提高了运算速度。

    ·end·


    Broadcast: Numpy中的广播机制_数据分析_03

    一个只分享干货的

    生信公众号



    上一篇:numpy中常用的数学运算和统计函数汇总
    下一篇:没有了
    网友评论