一、numpy队列
1.1、Python自带的队列
1、导入numpy
2、python.list
- python队列内的元素类型是可变的,可以是字符串、数字、元组等Python支持的所有类型;不符合机器学习的基本要求。
3、python.array
- 使用array我们就可以创建单一类型元素的数组,如下图:当申明为i时就说明此数组只能为整型数字
- 机器学习为什么不使用python.array:python.array没有把数据看成向量或者矩阵,同时也没有配置向量和矩阵相关的运算,所以在机器学习中使用python.array也不方便。
1.2、numpy.array基础
1、创建一个元素类型是整型数字的array数组
2、元素类型是整型数字的array也可以给他赋值浮点型数字
- 如果赋值为浮点数,会默认取小数点之前的整数,最后整个数组的类型还是整型不变
3、创建一个元素类型为浮点型的array数组
- 只要初始化数组中有一个值为浮点值,整个array数组的类型就是float64
- 机器学习处理的数据通常是浮点类型的数字
二、numpy数组和矩阵
2.1、其它创建numpy.array的放法
1、使用zeros和ones方法创建数组
- zeros方法默认创建浮点数数组:
- zeros方法创建整型数组:
- zeros方法创建矩阵:shape和dtype可以省略不指明
- ones方法同理:创建的数值均为1
2、使用full方法创建指定数值的矩阵
- 创建666的整型数组:full与前面介绍的两个方法不一样,如果fill_value的值为整型,则创建的数组或者矩阵的类型就是整型;如果fill_value的值为浮点数,则创建的数组或者矩阵的类型就是浮点型
- 创建666的浮点型数组:
- 如果我们指定了full方法里面的dtype属性的值,则创建的矩阵或者数组的类型就和dtype中的保持一致
2.2、arange和linspace
- arange和linspace都只能生成一维数组,不支持shape属性
1、arange方法
- 与python的range方法一样,遵循前闭后开原则,即数组取值包括起始值但是不包括结尾值;默认的取值间距为1,默认的取值起始值为0
2、linspace方法
- linspace不遵循前闭后开原则,而是遵循前闭后闭原则;即起始值和终止值均在所得数组中
- 下图中的10代表等差取10个数;11代表等差取11个数
2.3、random模块生成随机数
1、获取0到10之间的随机数组
- random随机取值遵循前闭后开的原则,如下图随机数永远取不到10
- 验证random的前闭后开原则
2、利用random创建一个随机矩阵
3、根据随机种子保存并获取上一次的随机取值结果
- 如果两次调用的seed值相同,则他们生成的随机矩阵就是一样的
4、获取浮点型随机数
- randint和random方法对比:
1、randint生成的是整型数值,random生成的是浮点数;
2、randint中只有一个数字时代表是生成0到该数字之间的随机数,但是random是获取的10个0到1之间的浮点数
5、生成一个符合正态分布(均值为0方差为1)的随机数
-
使用normal方法默认会生成一个符合正态分布的数据
-
生成一个平均值为5,方差为10的数
-
如下图是生成一个平均值为10,方差为100的矩阵
-
normal也可以这样使用:loc是平均数,scale是方差,size是大小;它们均可省略不写
-
numpy中random的其它用法::numpy中random模块的使用
三、numpy.array的基本操作
3.1、numpy.array基本属性
1、初始化一个一维数组和二维数组
2、基本属性
- ndim:输出当前矩阵是几维数组,如x是一维数组打印就是1,X是二维数组打印的就是2.
- shape:x是一维数组就只打印出一维的元素个数;X是二维数组就打印出二维的元素个数。
- size:打印出数组(矩阵)的大小
3.2、numpy.array的数据访问
- 基本的下标、切片访问等数据访问与python数组的数据访问相同
1、一维数组的下标、切片等数据访问
- 下标获取单个元素:
- 切片获取一段数据:遵循前闭后开原则;当不指定起始值时默认为0从第一个数开始切片;当不指定结束值时默认截取至最后一个数。
- 切片配合步长使用:python数组切片还有第三个参数可以指定就是步长;如下步长为2就表示隔两个步长取一个数。
- 逆向获取一段数组:步长为-1时就是逆向的访问数组;-2就是逆向的步长为2的取数组;但是切片起始值和终止值均有赋值并且步长为负数的话,起始值必须大于终止值,否则数组为空;步长为负数时,起始值为空,默认从最后一位数切片,终止值为空,默认切片到第一位数为止即终止值为0。也遵循前闭后开的原则
2、二维数组的下标、切片、逆向等数据访问
-
下标获取单个元素:推荐X[1,3]的方式获取,X[1][3]方式有问题,后续会提到
-
使用[i][j]方式切片获取数据:我们本来是要获取前两行前三列的内容;但是结果却是把前两行所有值都打印出来了;这是因为第一个[:2]将前两行的数值全部取出来了,[:3]是在已经处理过的数组上面再取前三行的所有数据,但是处理后的只有两行数据;所以得到的结果与我们预期的不同,所以numpy数组操作中推荐使用[i,j]。
-
使用[i,j]方式切片获取一段数据:遵循前闭后开原则
-
获取一行数组(行向量):
3.3、矩阵与子矩阵的关系
1、初始化一个子矩阵
- 修改subX中一个元素的值
2、subX中值修改了是否会影响X呢?
- X和subX是相互影响的,所以矩阵和其子矩阵事实上是同一个矩阵,相互影响,相互改变;自矩阵并不是说是一个新的矩阵了
3、如何在一个矩阵的基础上将其子矩阵创建为一个新的矩阵,与原矩阵互不影响?
- 使用copy()方法:可以看到subX中的元素改变并没有影响到X中的值
3.4、reshape命令
1、将一维数组转换为二维的矩阵
- reshape不会影响原来矩阵的数据结构