![数据科学技术与应用](https://wfqqreader-1252317822.image.myqcloud.com/cover/571/31486571/b_31486571.jpg)
2.2 多维数组运算
利用NumPy库的ndarray多维数组进行科学计算和数据处理时,不需要使用单层和多层循环语句,即可对一个或多个数组中的元素进行常用的计算和操作。便捷的运算模式可以让使用者只需关注计算和数据分析本身的逻辑,避免编程语言底层实现细节带来的困扰。
2.2.1 基本算术运算
1.二维数组与标量运算
【例2-3】 为所有学生的所有课程成绩增加5分。
![](https://epubservercos.yuewen.com/4FDE69/17042065704478806/epubprivate/OEBPS/Images/34665_30_1.jpg?sign=1738833336-SZDcMC0Bj9UtQPqSoUjSgIZhT3ZkkUkA-0-88d704bce49eab880a5feaae0f0abbf6)
Python内部实现数组与标量相加时,使用“广播机制”首先将标量5转换为元素值为5的5×7二维数组,然后再将scores和新生成的数组按位相加,等价于以下代码。
![](https://epubservercos.yuewen.com/4FDE69/17042065704478806/epubprivate/OEBPS/Images/34665_30_2.jpg?sign=1738833336-sgEVeRrBBthfXx5hd3L0tIC8bKmokYaR-0-011034954df2c3eb1f870836299da939)
2.二维数组与一维数组运算
【例2-4】 每个科目基础分不同,为各科目成绩增加相应的基础分。
首先创建一维数组存放不同科目增加的分数,然后将其和scores相加。
![](https://epubservercos.yuewen.com/4FDE69/17042065704478806/epubprivate/OEBPS/Images/34665_31_2.jpg?sign=1738833336-vTLUBWxDw1jDcOqmUfUmcdP8Ppc0G9Ek-0-a00f33657295113396c938b1ed39c9e3)
上面的加法操作同样也用到了广播机制,NumPy首先将一维数组bonus变成每列值相同的5×7二维数组,然后再和scores相加。
3.选定元素运算
如果需要对数组特定元素进行运算,可以先使用2.1节介绍的数据切片操作,得到特定元素,然后对其进行计算。如给“肖良英”的“English”加5分。
![](https://epubservercos.yuewen.com/4FDE69/17042065704478806/epubprivate/OEBPS/Images/34665_31_3.jpg?sign=1738833336-wte38Qlh8FTjdcfHy4FOhfppzWZmiLg6-0-e7b7fac5573a34341af65e7233f7f71a)
Python支持的常见算术运算,如“+”、“-”、“*”、“/”、“**”(平方)等都可以在多维数组上直接使用。
2.2.2 函数和矩阵运算
NumPy库支持ndarray元素级的通用函数和用于行、列或整个数组计算的聚集函数。另外,ndarray多维数组还支持常见的矩阵和矢量运算。
1.通用函数(ufunc)
通用函数有一元函数和二元函数,分别接收一个和两个输入数组,返回一个数组。常用的一元函数和二元函数如表2-2和表2-3所示。
表2-2 常用的一元函数
![](https://epubservercos.yuewen.com/4FDE69/17042065704478806/epubprivate/OEBPS/Images/34665_32_1.jpg?sign=1738833336-XGAF1DShq5uYbX9AsGTOzrgEBZ9XztFX-0-c27abebfaed68f0a26ca4ede8579d4cb)
表2-3 常用的二元函数
![](https://epubservercos.yuewen.com/4FDE69/17042065704478806/epubprivate/OEBPS/Images/34665_32_3.jpg?sign=1738833336-Gic7eAHFNagbYgeiL8qNAsDSTOfuAXE6-0-a8b4b2f1b1de4683f15f16131cfb4f1f)
【例2-5】 将学生的考试成绩转换成整数形式的十分制分数。
![](https://epubservercos.yuewen.com/4FDE69/17042065704478806/epubprivate/OEBPS/Images/34665_32_2.jpg?sign=1738833336-x9sQ2sLYZwa0ifylMUM64upiLhdoqgc9-0-fb8f1e0a2ec51e824dabcf970d1df6c6)
【例2-6】 使用subtract()函数为每个学生的分数减去3分。
![](https://epubservercos.yuewen.com/4FDE69/17042065704478806/epubprivate/OEBPS/Images/34665_32_4.jpg?sign=1738833336-FwjxffqP9YXSMQay0CnqWGELdKxQHoDt-0-20591f1168cfc285b6e42077d4f87d51)
NumPy使用广播机制把标量数据3变成了多维数组,然后和scores数组的各元素进行减法操作。
2.聚集函数
ndarray数组支持在行、列或数组全体元素上的聚集函数,可以求平均值、最大值、最小值、累加和等。常用的聚集函数如表2-4所示。
表2-4 常用的聚集函数
![](https://epubservercos.yuewen.com/4FDE69/17042065704478806/epubprivate/OEBPS/Images/34665_33_2.jpg?sign=1738833336-5gtO5GFfgQm8maT3uesQ5FSxcEWKDPIF-0-719b21f32af02bfb1e8c6586a4037ca7)
对于二维数组对象,可以指定聚集函数是在行上操作还是在列上操作。当参数axis为0时,函数操作的对象是同一列不同行的数组元素;当参数axis为1时,函数操作的对象是同一行不同列的数组元素。
【例2-7】 按照分析目标使用聚集函数进行统计。
1)统计不同科目的成绩总分。
![](https://epubservercos.yuewen.com/4FDE69/17042065704478806/epubprivate/OEBPS/Images/34665_33_3.jpg?sign=1738833336-770uw2BSVaict14RNcWjR7EZeaVf6ryX-0-f11812009e8577a99aa4f88e4c9a212f)
2)求“王微”所有课程成绩的平均分。
![](https://epubservercos.yuewen.com/4FDE69/17042065704478806/epubprivate/OEBPS/Images/34665_33_4.jpg?sign=1738833336-5lVAjtvnmUAYZFCG64yuwLXVm48SHc92-0-f1773e6596f906018cdc4f330315e047)
首先利用布尔型数组选择“王微”的所有成绩,然后使用求平均值函数mean()。
3)查询英语考试成绩最高的学生的姓名。
![](https://epubservercos.yuewen.com/4FDE69/17042065704478806/epubprivate/OEBPS/Images/34665_33_5.jpg?sign=1738833336-tV7cEQp1QXRPS2RCnDftBYBvmQNtOQxc-0-9af116a302439e6b2d4250b97a5f0b7f)
argmax()函数能返回特定元素的下标。首先通过列筛选得到由所有学生英语成绩组成的一维数组,接着通过argmax()函数返回一维数组中最高分的索引值,最后利用该索引值在names数组中查找到该学生的姓名。
2.2.3 随机数组生成函数
NumPy库的random模块补充了Python的随机数生成函数,可以高效地生成服从多种概率分布的随机样本。常用函数如表2-5所示。
表2-5 常用函数
![](https://epubservercos.yuewen.com/4FDE69/17042065704478806/epubprivate/OEBPS/Images/34665_34_1.jpg?sign=1738833336-aUfQxm4I02AmsYcdMYBYMirjZdurqSxj-0-46988307d582e185df1fa8816258f5a6)
这些函数均可以使用元组给定生成数组的维度。
【例2-8】 生成由10个随机整数组成的一维数组,整数的取值范围为0~5。
![](https://epubservercos.yuewen.com/4FDE69/17042065704478806/epubprivate/OEBPS/Images/34665_34_2.jpg?sign=1738833336-WMYR170IZ0a85yNiiugQozHbuAovTOuj-0-90ed0f6cb65006a821879e1a8aed24b9)
randint(start, end, size),生成元素值从start到end-1范围内的整数数组,数组的大小由参数size对应的元组给出。数组的元素值随机生成,start到end-1范围内各整数出现的概率相等。
生成5×6的二维随机整数,随机数的取值是0或1。
![](https://epubservercos.yuewen.com/4FDE69/17042065704478806/epubprivate/OEBPS/Images/34665_34_3.jpg?sign=1738833336-ZkNemR63RS3khTkvGUvD8EzWsr09pQ7g-0-c1379ac69264bff7fe4f8083729e567a)
正态分布(Normal Distribution)又称高斯分布,是一个在数学、物理及工程等领域都非常重要的概率分布,对统计学尤为重要。正态曲线呈钟形,两头低、中间高,如图2-1所示,因此又称为钟形曲线。
![](https://epubservercos.yuewen.com/4FDE69/17042065704478806/epubprivate/OEBPS/Images/34665_34_4.jpg?sign=1738833336-9PQqSNcF7Z2ujijqjeF0AicF7Q6U5652-0-6dd39528844a864674742e4e951178af)
图2-1 高斯分布概率密度图
正态分布概率密度由期望和方差两个统计量决定,normal函数可以模拟生成服从正态分布的一组数据。
【例2-9】 生成均值为0、方差为1服从正态分布的4×5二维数组。
![](https://epubservercos.yuewen.com/4FDE69/17042065704478806/epubprivate/OEBPS/Images/34665_35_1.jpg?sign=1738833336-S009DI3h83SQSAHJMfn6oBYSuEhzlNC8-0-39fac6a6b1519b1545810a4568130076)
思考与练习
1.将scores数组中所有学生的英语成绩减去3分并显示。
2.统计scores数组中每名学生所有科目的平均分并显示。
3.使用随机函数生成[-1,1]之间服从均匀分布的3×4二维数组,并计算所有元素的和。