2.2 多维数组运算
利用NumPy库的ndarray多维数组进行科学计算和数据处理时,不需要使用单层和多层循环语句,即可对一个或多个数组中的元素进行常用的计算和操作。便捷的运算模式可以让使用者只需关注计算和数据分析本身的逻辑,避免编程语言底层实现细节带来的困扰。
2.2.1 基本算术运算
1.二维数组与标量运算
【例2-3】 为所有学生的所有课程成绩增加5分。
Python内部实现数组与标量相加时,使用“广播机制”首先将标量5转换为元素值为5的5×7二维数组,然后再将scores和新生成的数组按位相加,等价于以下代码。
2.二维数组与一维数组运算
【例2-4】 每个科目基础分不同,为各科目成绩增加相应的基础分。
首先创建一维数组存放不同科目增加的分数,然后将其和scores相加。
上面的加法操作同样也用到了广播机制,NumPy首先将一维数组bonus变成每列值相同的5×7二维数组,然后再和scores相加。
3.选定元素运算
如果需要对数组特定元素进行运算,可以先使用2.1节介绍的数据切片操作,得到特定元素,然后对其进行计算。如给“肖良英”的“English”加5分。
Python支持的常见算术运算,如“+”、“-”、“*”、“/”、“**”(平方)等都可以在多维数组上直接使用。
2.2.2 函数和矩阵运算
NumPy库支持ndarray元素级的通用函数和用于行、列或整个数组计算的聚集函数。另外,ndarray多维数组还支持常见的矩阵和矢量运算。
1.通用函数(ufunc)
通用函数有一元函数和二元函数,分别接收一个和两个输入数组,返回一个数组。常用的一元函数和二元函数如表2-2和表2-3所示。
表2-2 常用的一元函数
表2-3 常用的二元函数
【例2-5】 将学生的考试成绩转换成整数形式的十分制分数。
【例2-6】 使用subtract()函数为每个学生的分数减去3分。
NumPy使用广播机制把标量数据3变成了多维数组,然后和scores数组的各元素进行减法操作。
2.聚集函数
ndarray数组支持在行、列或数组全体元素上的聚集函数,可以求平均值、最大值、最小值、累加和等。常用的聚集函数如表2-4所示。
表2-4 常用的聚集函数
对于二维数组对象,可以指定聚集函数是在行上操作还是在列上操作。当参数axis为0时,函数操作的对象是同一列不同行的数组元素;当参数axis为1时,函数操作的对象是同一行不同列的数组元素。
【例2-7】 按照分析目标使用聚集函数进行统计。
1)统计不同科目的成绩总分。
2)求“王微”所有课程成绩的平均分。
首先利用布尔型数组选择“王微”的所有成绩,然后使用求平均值函数mean()。
3)查询英语考试成绩最高的学生的姓名。
argmax()函数能返回特定元素的下标。首先通过列筛选得到由所有学生英语成绩组成的一维数组,接着通过argmax()函数返回一维数组中最高分的索引值,最后利用该索引值在names数组中查找到该学生的姓名。
2.2.3 随机数组生成函数
NumPy库的random模块补充了Python的随机数生成函数,可以高效地生成服从多种概率分布的随机样本。常用函数如表2-5所示。
表2-5 常用函数
这些函数均可以使用元组给定生成数组的维度。
【例2-8】 生成由10个随机整数组成的一维数组,整数的取值范围为0~5。
randint(start, end, size),生成元素值从start到end-1范围内的整数数组,数组的大小由参数size对应的元组给出。数组的元素值随机生成,start到end-1范围内各整数出现的概率相等。
生成5×6的二维随机整数,随机数的取值是0或1。
正态分布(Normal Distribution)又称高斯分布,是一个在数学、物理及工程等领域都非常重要的概率分布,对统计学尤为重要。正态曲线呈钟形,两头低、中间高,如图2-1所示,因此又称为钟形曲线。
图2-1 高斯分布概率密度图
正态分布概率密度由期望和方差两个统计量决定,normal函数可以模拟生成服从正态分布的一组数据。
【例2-9】 生成均值为0、方差为1服从正态分布的4×5二维数组。
思考与练习
1.将scores数组中所有学生的英语成绩减去3分并显示。
2.统计scores数组中每名学生所有科目的平均分并显示。
3.使用随机函数生成[-1,1]之间服从均匀分布的3×4二维数组,并计算所有元素的和。