重磅干货,第一时间送达 来源:大数据 Numpy提供的主要功能具体如下:
除了明显的科学计算用途之外,Numpy还可以用作通用数据的高效多维容器,定义任意的数据类型。这些都使得Numpy能够无缝、快速地与各种数据库集成。 提示:这里提到的“广播”可以这么理解:当两个维度不同的数组(array)运算的时候,可以将低维的数组复制成高维数组参与运算(因为Numpy运算的时候需要结构相同)。 在学习图像识别的过程中,需要将图片转换为矩阵。即将对图片的处理简化为向量空间中的向量运算。基于向量运算,我们就可以实现图像的识别。 01 创建数组 现在就来关注下Numpy中的一些核心知识点。在Numpy中,最核心的数据结构是ndarray, ndarray代表的是多维数组,数组指的是数据的集合。为了方便理解,我们下面列举一个小例子。 一个班级里学生的学号可以通过一维数组来表示,数组名为a,数组a中存储的是数值类型的数据,分别是1,2,3,4。
其中,a[0]代表的是第一个学生的学号1,a[1]代表的是第二个学生的学号2,以此类推。 一个班级里学生的学号和姓名,可以用二维数组来表示,数组名为b。
类似的,其中b[0,0]代表的就是1(学号),b[0,1]代表的就是Tim(学号为1的学生的名字),以此类推b[1,0]代表的是2(学号)等。 借用线性代数的说法,一维数组通常称为向量(vector),二维数组通常称为矩阵(matrix)。 当我们安装完Anaconda之后,默认情况下Numpy已经在库中了,所以不需要额外安装。下面我们来写一些语句简单测试下Numpy库。 1)在Anaconda的Notebook里输入 import numpy as np 之后,通过键盘按住Shift+Enter执行,如果没有报错,则说明Numpy已被正常引入,如图2-7所示。 ▲图2-7 在Notebook中引入Numpy 稍微解释下这条语句:通过import关键字将Numpy库引入,然后通过as为其取一个别名np,别名的作用是为了便于后续引用。 2)Numpy中的array()可以直接导入向量,代码如下:
3)numpy.array()方法也可以导入矩阵,代码如下: matrix = np.array([[1,'Tim'],[2,'Joey'],[3,'Johnny'],[4,'Frank']]) 02 创建Numpy数组 我们可以通过创建Python列表(list)的方式来创建Numpy矩阵,比如输入
可以看到返回的结果是 array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) 同样,也可以通过Python列表的方式来修改值,比如输入
再来观察nparray的向量内容就会发现返回的结果是 array([ 10, 1, 2, 3, 4, 5, 6, 7, 8, 9]) Numpy数组还封装了其他方法来创建矩阵。首先,我们介绍第一个方法np.zeros(从命名规则来看,这个方法就是用来创建数值都为0的向量),比如,我们输入:
可以看到结果为: array([ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]) 从上述结果可以看出,每一个0后面都有一个小数点,调用a.dtype会发现我们创建的这个向量的类型为dtype(‘float64’)。值得注意的是:在大部分图像识别算法开发中,我们使用的都是float64这个类型。如果希望在创建Numpy矩阵的时候强制规定一种类型,那么我们可以使用以下代码:
这样,返回的结果在矩阵中的数据就都是整型0了。介绍完使用zeros方法创建向量之后,再来看看如何创建一个多维矩阵。我们可以使用传入元组的方式,代码如下: np.zeros(shape=(3,4)) #代表创建的是三行四列的矩阵并且其数据类型为float64 返回的结果为:
与np.zeros方法相似的还有np.ones方法,顾名思义,np.ones方法创建的矩阵的数值都为1。我们来举个例子: np.ones((3,4)) 返回的结果如下:
读者可能会比较好奇,既然我们可以创建数值全为0的矩阵,也可以创建数值全为1的矩阵,那么Numpy是否提供了一个方法可以让我们自己指定值呢?答案是肯定的,这个方法就是np.full方法,我们来看一个例子,代码如下: np.full((3,5),121) #这个方法的意思是我们创建了一个三行五列的矩阵,默认值为121 返回的结果是:
我们也可以使用np.arange方法来创建Numpy的矩阵。示例代码如下: np.arange(0,20,2) #arange接收三个参数,与Python中的range方法相似,arange也是前闭后开的方法,第一个参数为向量的第一个值0,第二个参数为最后一个值20,因为是后开所以取的是18,第三个参数为步长,默认为1,本例中设置为2,所以最后一个值是18。 返回的结果是:
我们可以使用np.linspace方法(前闭后闭)来对Numpy矩阵进行等分,比如将0~10等分为5份的代码如下: np.linspace(0,10,5) 返回的结果是:
下面通过几个例子再来看看在Numpy矩阵中如何生成随机数矩阵。 1)生成一个长度为10的向量,里面每一个数值都是介于0~10之间的整数,代码如下: import numpy as np 2)如果不确定每个参数代表的意思,则加上参数名size,代码如下:
3)我们也可以生成一个三行五列的整数矩阵,代码如下 np.random.randint(4,9,size=(3,5)) 4)seed的作用:如果不希望每次生成的随机数都不固定,那么我们可以使用np.random.seed(1),随机种子使用数字1记录,这以后只要是用随机种子1生成的随机数就都是固定的。 5)我们也可以生成介于0~1之间的浮点数的向量或者矩阵,代码如下:
6)np.random.normal()表示的是一个正态分布,normal在这里是正态的意思。numpy.random.normal(loc=0,scale=1,size=shape)的意义如下:
03 获取Numpy属性 首先,我们通过Numpy中的一个方法arange(n),生成0到n-1的数组。比如,我们输入 np.arange(15) 可以看到返回的结果是
然后,再通过Numpy中的reshape(row,column)方法,自动构架一个多行多列的array对象。 比如,我们输入: a = np.arange(15).reshape(3,5) #代表3行5列 可以看到结果:
有了基本数据之后,我们就可以通过Numpy提供的shape属性获取Numpy数组的行数与列数,示例代码如下: print(a.shape) 可以看到返回的结果是一个元组(tuple),第一个3代表的是3行,第二个5代表的是5列:
我们可以通过.ndim来获取Numpy数组的维度,示例代码如下: importnumpy as np 04 Numpy数组索引 Numpy支持类似list的定位操作,示例代码如下:
得到的结果是2。 上述代码中的matrix[0,1],0代表的是行,在Numpy中,0代表起始的第一个,所以取的是第1行,之后的1代表的是列,所以取的是第2列。那么,最后的输出结果是取第一行第二列,也就是2这个值了。 05 切片 Numpy支持类似list的切片操作,示例代码如下: import numpy as np 上述的代码中
06 Numpy中的矩阵运算 矩阵运算(加、减、乘、除),在本书中将严格按照数学公式来进行演示,即两个矩阵的基本运算必须具有相同的行数与列数。本例只演示两个矩阵相减的操作,其他的操作读者可以自行测试。示例代码如下:
输出结果如下: [[ 1. 0. 0.] 提示:numpy.eye(N, M=None, k=0, dtype=<type 'float'>)中第一个参数输出矩阵(行数=列数),第三个参数默认情况下输出的是对角线的值全为1,其余值全为0。 除此之外,Numpy还预置了很多函数,使用这些函数可以作用于矩阵中的每个元素。 Numpy预置函数及说明:
1. 矩阵之间的点乘 矩阵真正的乘法必须满足第一个矩阵的列数等于第二个矩阵的行数,矩阵乘法的函数为dot。示例代码如下:
其输出结果如下: [[22 28] 上述示例代码的原理是将mymatrix的第一行[1,2,3]与a矩阵的第一列[1,3,5]相乘然后相加,接着将mymatrix的第一行[1,2,3]与a矩阵的第二列[2,4,6]相乘然后相加,以此类推。 2. 矩阵的转置 矩阵的转置是指将原来矩阵中的行变为列。示例代码如下:
输出结果如下: [[1 4] 3. 矩阵的逆 需要首先导入numpy.linalg,再用linalg的inv函数来求逆,矩阵求逆的条件是矩阵的行数和列数必须是相同的。示例代码如下:
输出结果如下: [[-1.5 0.5] 逆矩阵就是,原矩阵A.dot(invA)以及逆矩阵invA.dot(A)的结果都为单位矩阵。并不是所有的矩阵都有逆矩阵。 07 数据类型转换 Numpy ndarray数据类型可以通过参数dtype进行设定,而且还可以使用参数astype来转换类型,在处理文件时该参数会很实用。注意,astype调用会返回一个新的数组,也就是原始数据的备份。 比如,将String转换成float。示例代码如下:
注意:在上述例子中,如果字符串中包含非数字类型,那么从string转换成float就会报错。 |
|