一.数组基础
导入Numpy时,通常给其一个别名"np",即 import numpy as np
1.1 数据类型
1.整数型数组和浮点型数组
注意,使用print输出Numpy数组后,元素之间没有逗号,有两个好处:
1.可以将之与Python列表区分开来
2.避免逗号和小数点之间的混淆
2.同化定理
一个人的力量无法改变改变全体,在实际操作中要注意:
1.往整数型数组里插入浮点数,该浮点数会自动被截断为整数
2.往浮点型数组里插入整数,该整数会自动升级为浮点数
3.共同改变定理
整数型数组和浮点型数组相互转换,规范的方法是使用.astype()方法
除了上述方法,只要满足共同改变定理,整数型数组和浮点型数组仍然可以相互转换,最常见的是整数型数组在运算过程中升级为浮点型数组
整数型数组很好升级,但浮点型数组在运算过程中一般不会降级
1.2 数据维度
1.2.1 一维数组与二维数组
不同维度的数组之间,从外形上的本质区别是
一维数组使用1层中括号表示
二维数组使用2层中括号表示
三维数组使用3层中括号表示
有些函数需要传入数组的形状参数,不同维度数组的形状参数为
一维数组的形状参数如:x或(x,)
二维数组的形状参数如:(x,y)
三维数组的形状参数如:(x,y,z)
现在以同一个序列进行举例
当数组有1层中括号,如[1,2,3],则其为一维数组,其形状是3或(3,)
当数组有2层中括号,如[[1,2,3]],则其为二维数组,其形状是(1,3)
当数组有3成中括号,如[[[1,2,3]]],则其为三维数组,其形状是(1,1,3)
这里用后面要讲的np.ones0函数进行演示,只因其刚好需要传入形状参数
1.2.2 不同维度数组之间的转换
一维数组转二维数组,还是二维数组转一维数组,均要使用的是数组重塑方达.reshape(),该方法需要传入重塑后的形状参数
未来将一维数组称为向量,二维数组成为矩阵
二.数组的创建
2.1 创建指定的数组
当明确知道数组的为一个元素的具体数值时,可以使用**np.array()**函数,将Python列表转化为Numpy数组
2.2 创建递增数组
递增数组使用**np.arange()**函数进行创建
2.3 创建同值数组
需要创建同值数组时,使用np.zeros()函数以及np.ones()函数
两个函数输出的并不是整数型数组,这可能是为了避免插进去的浮点数被阶段,所以将其设定为浮点型数组
2.4 创建随机数组
去要创建随机数组,可以使用**np.random()**系列函数
三.数组的索引
3.1 访问数组元素
与Python列表一致,访问Numpy数组元素时是用中括号,索引由0开始
访问向量
访问矩阵
3.2 花式索引
之前访问单个元素时,向量用arr[x],矩阵用arr[x,y].
逗号在矩阵里用于区分行与列,这一小节,逗号新增一个功能,且不会与矩阵里的逗号混淆
向量的花式索引
矩阵的花式索引
3.3 访问数组切片
向量的切片
与列表的切片相同
矩阵的切片
提取矩阵的行
提取矩阵的行时可以简写,但提取列的时候不能简写
提取矩阵的列
3.4 数组切片仅是视图
数组切片仅是试图
与Python列表Matlab不同,Numpy数组的切片仅仅是原数组的一个视图.换言之,Numpy切片不会创建新的变量,新数组更改原数组也会更改
备份切片为新变量
如果真的需要为切片创建新变量,使用**.copy()方法**
3.5 数组赋值仅是绑定
与Numpy数组的切片一样,Numpy数组完整的赋值给另一个数组,也只是绑定.换言之,Numpy数组之间的赋值并不会创建新的变量,新数组数值改变会导致原数组数值的改变
可将数组拷贝.copy()
四.数组的变形
4.1 数组的转置
数组的转置方法为**.T**只对矩阵有效,因此遇到向量要先将其转化为矩阵
向量的转置
矩阵的转置
4.2 数组的翻转
数组的翻转方法有两个:
一个是上下翻转np.flipud(),表示up-down
一个是左右翻转np.fliplr(),表示letf-right
其中,向量只能使用np.flipud(),在数学中向量不是横着排的,而是竖着排的
向量的翻转
矩阵的翻转
4.3 数组的重塑
想要重塑数组的形状,需要用到**.reshape()方法**
向量的变形
矩阵的变形
4.4 数组的拼接
.concatenate([arr1,arr2])
向量的拼接
两个向量拼接,将得到一个新的加长版向量
矩阵的拼接
两个矩阵可以按不同的维度进行拼接,但拼接时必须注意维度的吻合
4.5 数组的分裂
向量的分裂
**np.split()**函数中,给出的第二个参数[2,8]表示在索引[2]和索引[8]的位置截断
矩阵的分裂
五.数组的运算
5.1 数组与系数之间的运算
Python基础中,常用的运算符与Numpy的运算符相同,数组和系数之间的运算是逐元素的运算
5.2 数组和数组之间的运算
同维度数组间的运算即对应元素之间的运算,这里仅以矩阵为例,向量与向量的操作与之相同
在这里乘法是遵循对应元素相乘的,可以称之为"逐元素乘积",那么如何实现线性代数中的"矩阵级乘法"呢?
5.3 广播
5.2是同形状数组之间的逐元素运算,本届讲解不通形状的数组之间的运算
仅讨论二维数组之内的情况,不同形状的数组之间的运算有以下规则:
1.如果是向量与矩阵之间做运算,向量自动升级为行矩阵
2.如果是某矩阵世行矩阵或列矩阵,则其被广播,以适配另一个矩阵的形状
向量被广播
当一个形状为(x,y)的矩阵与一个向量做运算时,要求该向量的形状必须为y,运算时向量会自动升级形状为(1,y)的行矩阵,该形状为(1,y)的行矩阵再自动被广播为形状为(x,y)的矩阵,这样就与矩阵的形状适配了
列矩阵被广播
当一个形状为(x,y)的矩阵与一个列矩阵做运算时,要求该列矩阵的形状必须为(x,1),改形状为(x,1)的列矩阵在自动被广播为形状为(x,y)的矩阵,这样就与另一个矩阵的形状适配了
行矩阵与列矩阵同时被广播
当一个矩阵的形状为(1,y),另一个矩阵的形状为(x,1),这两个矩阵做运算会自动广播为形状为(x,y)的矩阵
六.数组的函数
6.1 矩阵乘积
1.之前的乘法为"逐元素相乘",这里介绍线性代数中的矩阵乘积,本节只需要使用np.dot()函数
2.当矩阵乘积中混有向量时,根据需求,其可充当行矩阵,也可充当列矩阵,但混有向量时输出结果必为向量
向量和向量的乘积
(1,5)(5,1)->(1,1)
向量和矩阵的乘积
(1,5)(5,3)->(1,3)
矩阵和向量的乘积
(3,5)*(5,1)->(3,1)
矩阵和矩阵的乘积
6.2 数学函数
Numpy设计了很多数学函数
np.abs() 绝对值函数
np.sin()/np.cos()/np.tan() 三角函数
np.exp(x) 指数函数:表示e的x次方
np.log(x)/np.log(10) 对数函数,log以10为底的x次方
6.3 聚合函数
1.求最大值
np.max(arr,axis = 0) 按维度一求最大值
np.max(arr,axis = 1) 按维度二求最大值
np.max(arr) 求整体最大值
2.求和函数
np.sum(arr,axis = 0) 按维度一求和
np.sum(arr,axis = 1) 按维度二求和
np.sum(arr) 求整体和
3.均值函数
np.mean(arr,axis = 0)
np.mean(arr,axis = 1)
np.mean(arr)
七.布尔型数组
除了整数型数组和浮点型数组,还有一种布尔型数组
7.1 创建布尔型数组
两种方法
将数组与系数作比较,以产生布尔型数组
将同维数组作比较,以产生布尔型数组
同时比较多个条件,Python中使用and,or,not.但Numpy中使用与,或,非为:&,|,~
7.2 布尔型数组中True的数量
1.np.sum()函数统计布尔型数组里True的个数
2.np.any()函数只要布尔型数组含有一个及其以上的True,就返回True
3.np.all()函数当布尔型数组里全是True,才返回True
7.3 布尔型数组作为掩码
若一个普通数组和一个布尔型数组的维度相同,可以将布尔型数组作为普通数组的掩码,这样可以对普通数组中的元素做筛选
示例1
筛选出数组中大于,等于或小于某个数字的元素
注意,这个矩阵进行掩码操作后,退化为了向量
示例2
7.4 满足条件的元素所在位置
假设有一个很长的数组,想知道满足某个条件的元素们所在的索引位置,此时使用np.where()函数
八.从数组到张量
8.1 数组与张量
1.PyTorch作为当前首屈一指的深度学习库,起降NumPy的语法尽数吸收,作为自己处理数据的基本语法,且运算速度从实用CPU的数组进不到使用GPU的张量
2.NumPy和PyTorch的基本语法几乎一致,具体表现为:
(1) np对应torch
(2) 数组array对应张量tensor
(3) NumPy的n维数组对应着PyTorch的n阶张量
3.数组与张量之间可以相互转换:
(1) 数组arr转为张量ts: ts = torch.tensor(arr)
(2) 张量ts转为数组arr: arr = np.array(ts)