前言
Numpy是python中的科学计算工具包,提供了一个多维数组对象,用于多维数组或者矩阵的快速运算,包括线性代数基本运算,快速傅里叶变换,基本统计运算随机模拟等。在机器学习中涉及到大量的矩阵知识,熟练使用numpy包有利于快速理解并实现机器学习中的相关算法。Numpy有以下特性:
- numpy创建的多维数组(narray)拥有固定的大小,不像python中的列表(list),是可以动态增加的。改变numpy创建的多维数组的大小,会删除原来的多维数组,并创建一个新的数组。
- numpy创建的数组所有元素的类型必须是保持一致,并且在内存中拥有同样的大小。当numpy中的元素是对象时,可以拥有不同的大小和。
numpy包的安装
numpy包的安装可以直接使用以下命令:
pip install numpy
numpy的基本使用
- 用numpy创建数组
创建一个一维数组,如下代码所示,
import numpy as np
data = np.array([1,2,3])
其结果如下所示:
与一维数组的创建类似,多维数组的创建如下所示:
data = np.array([[1,2,3],[4,5,6]])
其结果如下所示:
使用numpy可以将一维数组转换为指定形状的多维数组,如下所示,将拥有24个元素的一维数组转换为的3维数组:
data = np.arange(24).reshape(2,3,4)
print(data)
除了常规的矩阵创建,在一些算法中,用到了大量的特殊矩阵,比如,单位矩阵,零矩阵等。单位矩阵的创建如下所示,其中,参数k代表除了第k条对角线的元素为1之外,其他全为0:
data_0 = np.eye(3)
data_1 = np.eye(3,k=1)
除了单位矩阵外,numpy也提供了一些特殊的方法用以创建一些特殊矩阵,如下所示:
- 查看多维数组的基本属性
numpy提供了大量方法用来查看创建的多维数组的基本属性,如下所示:
-
查看多维数组的维数
-
查看多维数组的形状,如下所示:
-
查看多维数组的大小,即返回多维数组所有元素的个数
-
查看多维数组的类型,返回数组中元素的类型,在创建数组是可以用特定参数指定元素的类型, 可以使用标准Python类型创建或指定dtype。 此外,numpy还提供自己的类型。 numpy.int32,numpy.int16和numpy.float64就是一些基本例子。
- 多维数组的一些基本形状操作
numpy提供了丰富的方法用来改变多维数组的形状,平时主要用到以下几种,如下所示:
-
将多维数组转换为一维数组,numpy提供了ravel()方法将多维数组可以转换为一维数组,如下所示:
-
在矩阵的运算中涉及到大量的转置运算,numpy提供了两种方法可以实现矩阵的转置操作,一种是narray.transpose() ,如下所示
而另一种是narray.T,两种方法都具有同样的效果
-
numpy也提供了一些方法用以实现多维数组的合并,按照其合并形式可以分为按行合并与按列合并,使用以下方法可以实现按行合并,
同理,按行合并可以用以下方法实现:
-
numpy除了提供了矩阵的合并方法外,还提供了用于将大矩阵分割为小矩阵的方法,与矩阵合并类似,矩阵分割也分为按行分割和按列分割。如下所示,分别表示按列分割和按行分割:
- 多维数组的排序相关操作
numpy也为多维数组的排序操作提供了相关方法,除了基本的排序操作,也提供求矩阵最大最小元素的相关方法,如下所示:
- 求多维数组的最大值(最小值)
numpy提供了一下方法用以求多维数组最大(或最小值的)的下标,如下所示,参数axis=0,表示求每一列最大值的下标,axis=1表示每一行最大值的下标,有axis参数时,返回值构成一个新的数组,而没有axis参数的默认情况下,argmax()
将多维数组看成是一维数组,返回值是最大值在在一维数组中的下标。
如果,不想将多维数组看成是一维数组处理,可以用以下方法获得多维数组的下标,如下所示:
多维数组最小值的处理方法与最大值基本相同,在此,不再多做介绍。获得多维数组的最大或者最小值,可以直接使用
max()
或者min()
方法。
- numpy的排序操作
numpy提供了一些用来给多维数组排序的操作,与求取最大最小值的方法类似,有返回数组元素和数组下标的两种方法,分别是sort()
和argsort()
方法,与max()
和argmax()
使用方法基本相同,在此也不多做介绍,值得注意的是,argsort()
方法仍然是将多维数组按照一维数组处理的,要返回多维数组的下标,可以使用unravel_index()
方法。
- numpy的基本统计运算
numpy提供了大量的方法用于基本的统计运算,而这些方法对于机器学习相关算法的理解和运行至关重要,numpy在统计学中的运用主要有以下几种:
- 协方差
协方差表示两个变量一起变化的水平,如果我们检查N维样本,X = [x_1,x_2,... x_N] ^ T,则协方差矩阵元素C_ {ij}是x_i和x_j的协方差。 元素C_ {ii}是x_i的方差,numpy中使用cov()
计算矩阵的协方差,其基本使用方法如下所示,通过计算结果,可以清楚看到,x第一行与第二行变化的快慢
-
均值计算
numpy提供了一个mean()
方法用来计算矩阵的均值,此外,参数axis=0
代表按列求取均值,axis=1
表示按行求取均值,基本使用方法如下所示:
-
计算矩阵的标准差
numpy提供了std()
方法用来计算矩阵标准差,与求矩阵均值类似,axis=0
代表按列求取,而axis=1
代表按行求取,具体使用方法,如下所示:
计算矩阵方差
numpy提供var()
方法用来计算矩阵方差,使用方法与标准差基本一样,在此不再多做介绍。
- numpy中的基本线性代数运算
矩阵在线性代数中的运用非常重要,numpy作为python中的多维数组库,提供了大量方法处理线性代数相关运算。
-
计算两个向量(数组)的叉积
两个向量的的叉积常用cross()
方法用来计算,其基本使用方法如下所示:
-
计算两个矩阵的点积,矩阵的点积计算相当于矩阵乘法,需要注意的是,矩阵点积计算必须遵循矩阵乘法运算原则。除此之外,复数的乘法可以使用点积进行计算,如下所示:
-
如下所示,可以通过
outer()
方法计算两个向量的外积
总结
通过以上介绍,大体了解了numpy的一些常用方法。当然,对numpy熟练使用需要更多的实践和练习,对numpy更高级的方法的使用和理解需要更为深厚的数学基础,尤其是要对线性代数和统计学的知识有更多地理解。对numpy库的更多了解可以参考numpy文档