从零开始学Python数据分析与挖掘
上QQ阅读APP看书,第一时间看更新

4.2 数组的基本运算符

本章开头就提到列表是无法直接进行数学运算的,一旦将列表转换为数组后,就可以实现各种常见的数学运算,如四则运算、比较运算、广播运算等。

4.2.1 四则运算

在numpy模块中,实现四则运算的计算既可以使用运算符号,也可以使用函数,具体如下例所示:

四则运算中的符号分别是“+-*/”,对应的numpy模块函数分别是np.add、np. subtract、np.multiply和np.divide。需要注意的是,函数只能接受两个对象的运算,如果需要多个对象的运算,就得使用嵌套方法,如上所示的符号加法和符号除法。不管是符号方法还是函数方法,都必须保证操作的数组具有相同的形状,除了数组与标量之间的运算(如除法中的身高与100的商)。另外,还有三个数学运算符,分别是余数、整除和指数:

可以使用“%、//、**”计算数组元素之间商的余数、整除部分以及数组元素之间的指数。当然,如果读者比较喜欢使用函数实现这三种运算的话,可以使用np.fmod、np.modf和np.power,但是整除的函数应用会稍微复杂一点,需要写成np.modf(arr7/arr8)[1],因为modf可以返回数值的小数部分和整数部分,而整数部分就是要取的整除值。

4.2.2 比较运算

除了数组的元素之间可以实现上面提到的数学运算,还可以做元素间的比较运算。关于比较运算符有表4-1所示的六种情况。

表4-1 比较运算符及其含义

运用比较运算符可以返回bool类型的值,即True和False。在笔者看来,有两种情况会普遍使用到比较运算符,一个是从数组中查询满足条件的元素,另一个是根据判断的结果执行不同的操作。例如:

运用bool索引,将满足条件的元素从数组中挑选出来,但不管是一维数组还是多维数组,通过bool索引返回的都是一维数组;np.where函数与Excel中的if函数一样,就是根据判定条件执行不同的分支语句。

4.2.3 广播运算

前面所介绍的各种数学运算符都是基于相同形状的数组,当数组形状不同时,也能够进行数学运算的功能称为数组的广播。但是数组的广播功能是有规则的,如果不满足这些规则,运算时就会出错。数组的广播规则是:

  • 各输入数组的维度可以不相等,但必须确保从右到左的对应维度值相等。
  • 如果对应维度值不相等,就必须保证其中一个为1。
  • 各输入数组都向其shape最长的数组看齐,shape中不足的部分都通过在前面加1补齐。

从字面上理解这三条规则可能比较困难,下面通过几个例子对每条规则加以说明,希望能够帮助读者理解它们的含义:

如上结果所示,第一个打印结果其实并没有用到数组的广播,因为这两个数组具有同形状;第二个打印结果是三维数组和两维数组的和,虽然维数不一样,但末尾的两个维度值是一样的,都是4和3,最终得到5×4×3的数组;第三个打印中的两个数组维数和维度值均不一样,但末尾的两个维度值中必须含一个1,且另一个必须相同,都为4,相加之后得到5×4×3的数组;第四个打印结果反映的是4×3的二维数组和(3,)的一维数组的和,两个数组维度不一致,为了能够运算,广播功能会自动将(3,)的一维数组补齐为(1,3)的二维数组,进而得到4×3的数组。通过对上面例子的解释,希望读者能够掌握数组广播功能的操作规则,以防数组运算时发生错误。