Python numpy之广播机制

456 阅读4分钟

image.png

「这是我参与2022首次更文挑战的第4天,活动详情查看:2022首次更文挑战

前言

在 numpy 模块中 array 是核心的数据结构。numpy 模块中专门提供 ndarray 来创建 N 维数组对象。我们在 numpy 模块之 ndarray 一问中,可以知道 ndarray 中数据元素都是同类型的,并且在内存中提供解释数据的方式,主要有常见scalar。

image.png

  • ndarray.shape : 描述数组形状,返回值以元组的形式展示(row,column)
  • ndarray.dim : 描述数组的维度
  • ndarray.strides: 描述维间距
  • ndarray.dtype: 描述数组中数据类型,展示每个数据占用多少字节,如int32,float64等

同时,numpy 模块中的数组存在拷贝的场景,我们在numpy 模块之视图与副本 中,对数组的视图相当于浅拷贝,与原数组共享数据;副本相当于深拷贝,与原始数组相互独立。

经过前几天的学习,我们对 numpy 模块特点摸了差不多了,等等...

老乡别走,numpy 模块还有很多知识点的,打起精神来。

又借用一下 python list来举例,我们在学习list时,也学习过两个或者多个列表合并的过程。

大家还记,list 合并列表有几种方法?

聪明的你们肯定想到最简单的就是使用"+"来添加啦,那我们来看numpy模块中数组"+"计算会是怎么样的,Let's go~~

1. 广播引出

首先,我们来看看小栗子,对比两个list和两个数组进行加法计算

>>> import numpy as np

# 两个shape同数组进行"+"计算
>>> arr1 = np.array([0,1,3])
>>> arr2 = np.array([5,6,7])
>>> arr1+arr2
array([ 5,  7, 10])

#两个列表进行“+”计算
>>> List1 = [0,1,3]
>>> List2 = [5,6,7]
>>> List1+List2
[0, 1, 3, 5, 6, 7]
>>>

通过上述栗子,我们可以看到list通过"+"是将两个列表的数据合并在一起。

两个数组通过“+”号计算,是将同shape的两个数组的数据则一一对应进行加法计算。

image.png

如果当两个数组的形状不相同的时候,进行算术运算,这时候numpy会触发广播规则进行操作

>>> arr1 = np.array([0,1,3])
>>> arr1+3
array([3, 4, 6])
>>>

image.png

所以,当两个不同shape的数组中数值进行加、减以及乘法计算,这种方式是通过广播(Broadcasting)的方式实现的。

2. 广播规则

从第一节小案例中,我们知道 numpy 广播触发的条件是: 不同shape的数组进行运算时

我们来看看广播有哪些规则吧:

  • 规则一:自动补齐

    • 自动让所有参与计算的数组的形状与最长的数组保持一致
    • 形状不足的部分会通过复制前面的数据补齐
    >>> arr2 = np.array([0,3,1])
    >>> arr1 + arr2
    array([[ 1,  5,  4],
           [ 5,  9,  8],
           [ 8, 12,  1]])
    >>>
    
    

    image.png

    • 我们可以查到,arr1.shape 是(3,3), arr2.shape 是(3,1)。arr1 和 arr2 shape是不一样。
    • 触发numpy 广播功能,将arr2通过前面自动补1
    • 从而达到了 arr1 和 arr2 shape一样,然后再进行算术运算
  • 规则二:以形状最大的形式输出结果

    • 输出数组的形状是参与计算的数组中各维度上最大值

    >>> arr1 = np.arange(3).reshape((3,1))
    >>> arr2 = np.arange(3)
    >>> arr1 + arr2
    array([[0, 1, 2],
           [1, 2, 3],
           [2, 3, 4]])
    >>>
    

    image.png

    • 首先查看 arr1.shape是(3,1),arr2.shape是(1,3)
    • arr1 数组通过列向补齐后变成(3,3)
    • arr2 数组通过行向补齐后也变成(3,3)
    • 最后进行arr1 和 arr2 转换成shape一样的进行算术运算
  • 规则三:参与计算的数组维度均不一致时,程序会报错

    >>> arr1 = np.array([[1,2,3],[5,6,7],[8,9,0]])
    >>> arr2 = np.array([0,3])
    >>> arr1 + arr2
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    ValueError: operands could not be broadcast together with shapes (3,3) (2,)
    >>>
    

在numpy 广播机制在我们matplotlib 绘制图表时,经常运用。两个 numpy 数组值进行算术运算,会对我们绘制的图表产生不一样的效果。

总结

本期,我们对numpy 模块数组计算的广播机制。当两个不同shape的数组,且一个矩阵有一行或者一列时,numpy 广播机制就会触发,自动按照前面的数据进行补齐,并且以各个数组中维度最大的shape输出结果。

以上是本期内容,欢迎大佬们点赞评论,下期见~