机器学习学习笔记(一):Numpy基础操作(一)

写在前面的废话

因为在机器学习中经常需要对数据进行一些操作,Numpy提供了许多非常方便的数组和矩阵的操作,但是系统地介绍Numpy这个包的课程并不多,所以就把最近在学习的课程里面关于Numpy的内容整理出来。

首先,在Python中使用import numpy引入numpy包,可通过import numpy as np将numpy简写为np,下面的代码中都使用np代表numpy.

Numpy数组

Python中需要表示一个数组时通常有两种表示方式,一种是List,一种是Array。List可以用于保存不同类型的数据元素,使用起来非常灵活方便,但是相对而言查找的效率就比较低;Array相当于是二维数组,只能用于保存一种类型的数据元素,数据类型可以在创建时指定。

Numpy中也提供了类似Array的操作,但是不同于Python本身的Array代表的只是二维数组,Numpy中的Array表示的是一个张量,可以用于表示多维数组。

Numpy.Array同样需要指定数据类型,通常情况下会根据数据元素设置默认的数据类型,如可以根据下面的方式创建Numpy数组,数据类型默认为int32类型
机器学习学习笔记(一):Numpy基础操作(一)_第1张图片
如果使用其他数据类型给数组元素赋值,数组将会对赋值的元素进行隐式转换,无法转换的解释器则会报错
机器学习学习笔记(一):Numpy基础操作(一)_第2张图片

创建Numpy数组(和矩阵)的几种方法

numpy.zeros、numpy.ones和numpy.full

numpy.zeros可以用于创建数据元素全部为0的数组,创建时可以指定数据元素的个数、数据类型(不指定时默认为浮点型),也可以通过shape参数指定数组的行数列数,以此来创建多维数组
机器学习学习笔记(一):Numpy基础操作(一)_第3张图片
同样可以通过numpy.ones创建全1矩阵,具体使用方法与numpy.zeros类似
这里写图片描述
如果想要创建数据元素全部为指定值的数组,则需要使用numpy.full方法,具体操作与上面两种方法类似,其中通过fill_value参数指定需要填充的指定值,与上面两种方法不同的是,numpy.full方法的默认数据类型为整型,需要指定数据类型时也可通过dtype参数指定
这里写图片描述

numpy.arange和numpy.linspace

Python中经常使用range来构建生成表达式,其中包括三个参数:起始点(包含)、终止点(不包含)和步长。Numpy中的arange与range的三个参数含义相同,唯一的区别是,arange中的步长可以是浮点型,而range中的步长必须为整型
机器学习学习笔记(一):Numpy基础操作(一)_第4张图片
而numpy.linspace方法同样有三个参数,分别为起始点(包含)、终止点(包含)和截取的元素个数,如下面的第一行代码的含义是我要获取0到20这个闭区间里面距离相等的10个元素
这里写图片描述

numpy.random

random模块顾名思义是用来生成随机数的,我们可以通过numpy.random.randit方法生成随机整数,通过参数指定起始点(包含)和终止点(不包含),可以通过size参数指定生成随机数的个数,这个参数也可以以元组的形式传入创建多维矩阵
机器学习学习笔记(一):Numpy基础操作(一)_第5张图片
由于计算机中生成的随机数都是伪随机数,所以为了方便实验操作,可以通过设置相同的随机种子使得每次生成的随机矩阵是相同的
机器学习学习笔记(一):Numpy基础操作(一)_第6张图片
通过numpy.random.random方法可以生成0到1之间的随机浮点数,也可以通过指定size参数生成数组或矩阵
机器学习学习笔记(一):Numpy基础操作(一)_第7张图片
numpy.random.random方法生成的是0到1之间服从均匀分布的随机数,如果想要生成服从正态分布的随机数可以使用numpy.random.normal方法,默认生成的是服从标准正态分布的随机数,均值和方差可以通过参数指定,和numpy.random.random方法一样,同样可以使用size参数生成数组或矩阵
机器学习学习笔记(一):Numpy基础操作(一)_第8张图片

Numpy数组(和矩阵)的基本操作

基本属性

下图中展示了Numpy的数组和矩阵几个常见的属性:ndim表示维数、shape以元组的形式表示该数组或矩阵包含几行几列、size表示数组或矩阵中的元素个数
机器学习学习笔记(一):Numpy基础操作(一)_第9张图片

Numpy的数据访问

在Numpy中和Python一样可以使用下标访问数组元素,如使用x[0]访问一维数组x的第0个元素,而对于二维数组,Numpy允许使用元组作为参数表示需要访问的元素的行和列,如X[(2,2)]访问第2行第2列的元素,其中圆括号可以省略
机器学习学习笔记(一):Numpy基础操作(一)_第10张图片
Numpy同样也支持Python中的切片操作,对于多维数组,可以对每一个维度进行切片,如X[:2,:3]表示需要访问矩阵X前2行前3列的所有元素
机器学习学习笔记(一):Numpy基础操作(一)_第11张图片
当需要对数据进行降维处理时,同样可以通过切片的方式,只需要对需要降维的维度取:即可,如X[0,:]表示取第0行在列的方向上降维,此时得到的新矩阵维度为1
机器学习学习笔记(一):Numpy基础操作(一)_第12张图片
Numpy中对于子矩阵的操作与Python中的List有一点不同,List使用切片操作获得的是一个全新的矩阵,而Numpy考虑的更多是实现的效率,所以使用切片操作时采用的是类似于引用的方式。因此,修改子矩阵中的元素原矩阵中的对应元素也会被修改,修改原矩阵中的元素子矩阵中对应的元素也会被修改。
机器学习学习笔记(一):Numpy基础操作(一)_第13张图片
如果想要创建一个与原矩阵不相关的子矩阵,可以调用copy函数,copy函数相当于是对切片生成的子矩阵进行了一次复制,这样修改子矩阵的元素的时候就不会影响到原矩阵
机器学习学习笔记(一):Numpy基础操作(一)_第14张图片

Numpy中的Reshape操作

Reshape主要用来对已有的数组或矩阵进行一些改变维度的操作,通过元组的形式传入参数表示需要改变的维度(元组的圆括号可以省略),此时reshape过的矩阵本身是不会改变的,如果需要保存reshape操作的结果需要将它赋值给一个新的矩阵
机器学习学习笔记(一):Numpy基础操作(一)_第15张图片
注意下面的矩阵x和矩阵B是不一样的,虽然同样是一行每行有10个元素,但是矩阵x为一个一维矩阵,矩阵B为一个二维矩阵,只是第一维的维度恰好为1
机器学习学习笔记(一):Numpy基础操作(一)_第16张图片
使用reshape操作时可以只指定某一个维度的维数,不指定维数的维度传入参数-1,Numpy将自动根据指定的维数计算出不指定的维数,但指定的维数需能够整除矩阵的元素个数,否则解释器会报错
机器学习学习笔记(一):Numpy基础操作(一)_第17张图片

Numpy数组(和矩阵)的合并与分割

合并操作

Numpy中可以使用numpy.concatenate对数组或矩阵进行拼接操作,参数以列表的形式传入,可以支持多个数组或矩阵的拼接,也可以支持多维矩阵的拼接
机器学习学习笔记(一):Numpy基础操作(一)_第18张图片
concatenate方法默认是在行的方向上进行拼接,如果需要在列的方向上进行拼接,如将两个2行3列的矩阵拼接成一个2行6列的矩阵,则需要通过axis参数进行设置。axis参数表示的是拼接的方向,默认axis=0表示沿第一个维度的方向进行拼接,如果需要沿列的方向进行拼接,则需使axis=1
机器学习学习笔记(一):Numpy基础操作(一)_第19张图片
concatenate方法只支持维数相同的数组或矩阵的拼接,维数不相同的数组或矩阵拼接解释器会报错,需要通过reshape方法将其转换成维数相同的数组或矩阵才可进行拼接
机器学习学习笔记(一):Numpy基础操作(一)_第20张图片
除了concatenate方法,Numpy中还提供了更方便地在水平和竖直方向上进行拼接的方法:vstack用于将两个矩阵在竖直方向上拼接,hstack用于将两个矩阵在水平方向上拼接,这两个方法可以自动判断如何将两个维数不同的矩阵在相应的方向上进行拼接,不需要通过reshape方法转换
机器学习学习笔记(一):Numpy基础操作(一)_第21张图片

分割操作

Numpy中可以使用split方法对数组进行分割,传入的第一个参数为需要分割的数组,第二个参数以列表的形式传入分割点,如图中传入两个分割点,即将数组x沿这两个分割点分割成3个子数组,返回值为3个子数组,分别赋值给x1,x2,x3
机器学习学习笔记(一):Numpy基础操作(一)_第22张图片
对于二维矩阵同样可以进行分割操作
机器学习学习笔记(一):Numpy基础操作(一)_第23张图片
split方法默认是在行的方向上进行分割,即axis=0,如果需要在列的方向上进行分割,可以设置参数axis=1
机器学习学习笔记(一):Numpy基础操作(一)_第24张图片
与合并操作类似,Numpy中也提供了在水平方向和竖直方向上进行分割的方法:vsplit用于将矩阵在竖直方向上分割,hsplit用于将矩阵在水平方向上分割
机器学习学习笔记(一):Numpy基础操作(一)_第25张图片

你可能感兴趣的:(机器学习)