「这是我参与2022首次更文挑战的第4天,活动详情查看:2022首次更文挑战」
前言
在 numpy 模块中 array 是核心的数据结构。numpy 模块中专门提供 ndarray 来创建 N 维数组对象。我们在 numpy 模块之 ndarray 一问中,可以知道 ndarray 中数据元素都是同类型的,并且在内存中提供解释数据的方式,主要有常见scalar。
- 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的两个数组的数据则一一对应进行加法计算。
如果当两个数组的形状不相同的时候,进行算术运算,这时候numpy会触发广播规则进行操作
>>> arr1 = np.array([0,1,3])
>>> arr1+3
array([3, 4, 6])
>>>
所以,当两个不同shape的数组中数值进行加、减以及乘法计算,这种方式是通过广播(Broadcasting)的方式实现的。
2. 广播规则
从第一节小案例中,我们知道 numpy 广播触发的条件是: 不同shape的数组进行运算时
我们来看看广播有哪些规则吧:
-
规则一:自动补齐
- 自动让所有参与计算的数组的形状与最长的数组保持一致
- 形状不足的部分会通过复制前面的数据补齐
>>> arr2 = np.array([0,3,1]) >>> arr1 + arr2 array([[ 1, 5, 4], [ 5, 9, 8], [ 8, 12, 1]]) >>>- 我们可以查到,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]]) >>>- 首先查看 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输出结果。
以上是本期内容,欢迎大佬们点赞评论,下期见~