文章目录
- 零、学习目标
- 一、NumPy概述
- 二、多维数组对象
- 三、创建NumPy多维数组
- 1、利用array()函数创建NumPy数组
- 2、创建NumPy数组的其它函数
- (1)利用zeros函数创建元素全为0的数组
- (2)利用ones函数创建元素全为1的数组
- (3)利用empty函数创建数组
- (4)arange函数是Python内置函数range的数组值版本
- 3、创建数组函数表
- 4、数组元素的数据类型
- 四、NumPy数组运算
- 1、数组与数组算术运算
- 2、数组与标量算术运算
- 3、数组与数组关系运算
- 4、数组与标量关系运算
- 5、广播概述
- 五、基本索引与切片
- 1、NumPy一维数组索引与切片
- 2、NumPy二维数组索引与切片
- 六、Numpy函数
- (一)数学函数
- (二)统计函数
- 1、最大值与最小值函数 - amax, amin
- 2、求最大值与最小值之差函数 - ptp
- 3、统计百分位函数 - percentile
- 4、中位数函数median和平均数函数mean
- 5、加权平均函数 - average
- 6、方差函数var与标准差函数std
- (三)排序函数
- 七、扩展练习
- 1、任务:二维随机数组取绝对值
- 方法一、利用条件切片
- 方法二、利用np.abs()函数
- 2、任务:求解三元一次方程组
零、学习目标
- 掌握NumPy多维数组的创建
- 掌握NumPy多维数组的运算
- 掌握NumPy的基本索引与切片
- 熟悉NumPy的数学、统计与排序函数
一、NumPy概述
NumPy(Numerical Python)是Python的一种开源的数值计算扩展。这种工具可用来存储和处理大型矩阵,比Python自身的嵌套列表(Nested List Structure)结构要高效得多,该结构也可以用来表示矩阵(Matrix),支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库 。
NumPy数组占用内存比Python内置序列要少得多,数组运算无须Python的for循环,当然计算效率更更高。
二、多维数组对象
NumPy的ndarray是保存Python大数据集的快速灵活的容器。NumPy数组运算类似于Python标量运算。
-
创建一个二行三列的二维随机数组
-
进行翻倍运算
-
进行自相加运算
-
如果换成Python的二维列表来处理翻倍运算,那就会十分繁琐,演示如下:
-
由上可知,如果二维列表乘上2,不是每个元素翻倍,而是将元素个数翻倍了,由两行三列扩展成四行三列,前两行与后两行完全相同。
-
正确的做法如下所示:先通过嵌套列表解析得到元素翻倍的普通列表,然后再将普通列表转换成二维列表。
-
一个ndarray是一个同类型数据的通用多维容器,那就是说数组的所有元素必须是相同类型。每一个数组都有一个shape属性,表示每维大小的元组,还有一个dtype属性,描述数组的数据类型。
三、创建NumPy多维数组
1、利用array()函数创建NumPy数组
-
array()函数接收任何序列对象,或者其它数组。
-
由列表创建NumPy一维数组
-
由嵌套列表创建NumPy二维数组
-
由嵌套列表data2生成的数组arr2是二维数组,三行四列,可以通过shape、dtype和ndim属性来获取相关信息;除非显式指定,np.array试图推断出它所创建数组的类型。数据类型保存在dtype元数据对象里。
2、创建NumPy数组的其它函数
- 除了用np.array,还有不少其它创建新数组的函数,比如zeros、ones、empty函数,要用这些方法创建高维数组,传入一个元组指定数组的shape。
(1)利用zeros函数创建元素全为0的数组
(2)利用ones函数创建元素全为1的数组
(3)利用empty函数创建数组
- 假定np.empty会返回全1或全0的数组,在某些情况下,可能会返回没有初始化的垃圾值。
(4)arange函数是Python内置函数range的数组值版本
- NumPy专注于数值计算,如果不指定,整数默认类型是int32,实数默认类型是float64。
- 当然在创建数组时可以根据需要指定数组类型
3、创建数组函数表
- asarray()函数
- zeros_like()与ones_like()函数
- full()函数
- 产生单位矩阵 - eye()与identity()函数
4、数组元素的数据类型
- ndarray数组类型是保存在dtype属性里的
- float64,双精度实数,8个字节,64位
- float32,单精度实数,4个字节,32位
- 类型转换演示
- 当然有些时候类型转换会失败
四、NumPy数组运算
NumPy数组可以进行不用for循环进行批量数据操作,用户称之为向量化。
1、数组与数组算术运算
- 相同尺寸的数组进行算术运算,是逐个元素进行相应的运算。
2、数组与标量算术运算
- 不仅数组与数组可以进行四则运算,而且数组与标量也可以进行四则运算
3、数组与数组关系运算
- 数组与数组,不仅可以进行算术运算,还可以进行关系运算
4、数组与标量关系运算
- 甚至,数组与标量也可以进行关系运算
5、广播概述
- 不同尺寸数组进行的运算,称之为广播(broadcasting)。
五、基本索引与切片
NumPy数组索引操作是个丰富的话题,有很多不同的方式去选择数组的子集或单个元素。
1、NumPy一维数组索引与切片
- NumPy一维数组索引操作很简单,表面上看起来类似于Python的列表索引操作。
- 在NumPy里,可以对切片赋一个列表,也可以赋一个标量,而Python的列表切片(元素个数超过1个)是不能赋一个标量。
- NumPy数组与Python列表在切片上还有一个不同,NumPy数组切片是原数组的“视图”,视图上的修改会反映到原数组上。
- 如果希望数组切片上的操作不影响原数组,那么利用copy方法来生成一个切片备份就可以。
2、NumPy二维数组索引与切片
- 对于二维数组,单索引访问到的是一维数组,比如arr2d[1]访问的第二行[1, 4, 9]。
- 访问二维数组的某个元素,有两种做法
六、Numpy函数
(一)数学函数
- add 求和
- subtract 求差
- multiply 求积
- divide 求商
- power 求幂
- remainder 求余
(二)统计函数
1、最大值与最小值函数 - amax, amin
2、求最大值与最小值之差函数 - ptp
3、统计百分位函数 - percentile
4、中位数函数median和平均数函数mean
5、加权平均函数 - average
6、方差函数var与标准差函数std
(三)排序函数
- sort函数
假设一个团队有5名学员,成绩如下表所示。用NumPy统计他们在语文、英语和数学的平均成绩、最小成绩、最大成绩、方差和标准差。然后按照总成绩排序,得出名次,输出成绩。
- 创建程序 - 统计成绩.py
# -*- coding: utf-8 -*-
"""
Created on Thu Oct 22 18:01:53 2020
@author: howard
统计成绩
"""
import numpy as np
stutype = np.dtype({
'names': ['name', 'chinese', 'math', 'english'],
'formats': ['S32', 'i', 'i', 'i', 'i']})
students = np.array([('mike', 95, 80, 78),
('alice', 87, 90, 80),
('green', 93, 78, 72),
('brown', 89, 95, 84),
('brian', 60, 90, 89)], dtype=stutype)
chinese = students[:]['chinese']
math = students[:]['math']
english = students[:]['english']
def show(name, subject):
print("{} | {:^6.2f} | {:^6.1f} | {:^6.1f} | {:^6.2f} | {:^6.2f}".format(name, np.mean(subject),
np.amax(subject), np.amin(subject), np.var(subject), np.std(subject)))
print('科目 | 平均分 | 最高分 | 最低分 | 方差 | 标准差')
show('语文', chinese)
show('数学', math)
show('英语', english)
print()
print("姓名 | 语文 | 数学 | 英语 | 总分")
rankings = sorted(students, key=lambda x: x[1]+x[2]+x[3])
for ranking in rankings:
print("{:5s}|{:^6d}|{:^6d}|{:^6d}|{:^6d}".format(ranking['name'].decode('utf-8'), ranking['chinese'], ranking['math'], ranking['english'],
ranking['chinese'] + ranking['math'] + ranking['english']))
- 运行程序,查看结果
- 如果按照单科排序,那么可以直接利用np.sort方法,指定order属性值即可。
- 可以看到确实按数学成绩升序排列:78、80、90、90、95
- 如果要数学成绩降序排列,可以这样来做:
七、扩展练习
1、任务:二维随机数组取绝对值
方法一、利用条件切片
方法二、利用np.abs()函数
2、任务:求解三元一次方程组
{
x
+
2
y
+
3
z
=
14
(
1
)
2
x
−
4
y
+
z
=
−
3
(
2
)
3
x
+
5
y
−
2
z
=
7
(
3
)
\begin{cases} x + 2y + 3z = 14 &(1)\\ 2x -4y +z = -3 &(2)\\ 3x + 5y - 2z = 7 &(3) \end{cases}
⎩
⎨
⎧x+2y+3z=142x−4y+z=−33x+5y−2z=7(1)(2)(3)
# -*- coding: utf-8 -*-
"""
Created on Thu Oct 22 18:09:11 2020
@author: howard
求解三元一次方程组
"""
import numpy as np
A = np.array([[1, 2, 3],
[2, -4, 1],
[3, 5, -2]])
B = np.array([[14],
[-3],
[7]])
X = np.dot(np.linalg.inv(A), B)
print('x1 = {:.2f}\nx2 = {:.2f}\nx3 = {:.2f}'.format(X[0, 0], X[1, 0], X[2, 0]))
print()
X = np.linalg.inv(A).dot(B)
print('x1 = {:.2f}\nx2 = {:.2f}\nx3 = {:.2f}'.format(X[0, 0], X[1, 0], X[2, 0]))
print()
X = np.linalg.solve(A, B)
print('x1 = {:.2f}\nx2 = {:.2f}\nx3 = {:.2f}'.format(X[0, 0], X[1, 0], X[2, 0]))