首页 » 机器学习实战 » 机器学习实战全文在线阅读

《机器学习实战》A.3 NumPy快速入门

关灯直达底部

NumPy库安装完成后,读者可能在想:“这东西有什么好处?”正式来说,NumPy是Python的一个矩阵类型,提供了大量矩阵处理的函数。非正式来说,它是一个使运算更容易、执行更迅速的库,因为它的内部运算是通过C语言而不是Python实现的。尽管声称是一个关于矩阵的库,NumPy实际上包含了两种基本的数据类型:数组和矩阵。二者在处理上稍有不同。如果读者熟悉MATLABTM的话,矩阵的处理将不是难事。在使用标准的Python时,处理这两种数据类型均需要循环语句。而在使用NumPy时则可以省去这些语句。下面是数组处理的一些例子:

>>> from numpy import array>>> mm=array((1, 1, 1))>>> pp=array((1, 2, 3))>>> pp+mmarray([2, 3, 4])   

而如果只用常规Python的话,完成上述功能需要使用for循环。另外在Python中还有其他一些需要循环的处理过程,例如在每个元素上乘以常量2,而在NumPy下就可以写成:

>>> pp*2array([2, 4, 6])      

还有对每个元素平方:

>>> pp**2array([1, 4, 9])    

可以像列表中一样访问数组里的元素:

>>> pp[1]2  

NumPy中也支持多维数组:

>>> jj = array([[1, 2, 3], [1, 1, 1]])  

多维数组中的元素也可以像列表中一样访问:

>>> jj[0]array([1, 2, 3])>>> jj[0][1]2   

也可以用矩阵方式访问:

>>> jj[0,1]2   

当把两个数组乘起来的时候,两个数组的元素将对应相乘:

>>> a1=array([1, 2,3])>>> a2=array([0.3, 0.2, 0.3])>>> a1*a2array([ 0.3, 0.4, 0.9])    

下面来介绍矩阵。

与使用数组一样,需要从NumPy中导入matrix或者mat模块:

>>> from numpy import mat, matrix  

上述NumPy中的关键字matmatrix的缩写。

>>> ss = mat([1, 2, 3])>>> ssmatrix([[1, 2, 3]])>>> mm = matrix([1, 2, 3])>>> mmmatrix([[1, 2, 3]])    

可以访问矩阵中的单个元素:

>>> mm[0, 1]2   

可以把Python列表转换成NumPy矩阵:

>>> pyList = [5, 11, 1605]>>> mat(pyList)matrix([[ 5, 11, 1605]])   

现在试试将上述两个矩阵相乘:

>>> mm*ssTraceback (most recent call last):    File /"<stdin>/", line 1, in <module>    File /"c:Python27libsite-packagesnumpymatrixlibdefmatrix.py/",line 330, in __mul__    return N.dot(self, asmatrix(other))ValueError: objects are not aligned   

可以看到出现了一个错误:乘法不能执行。矩阵数据类型的运算会强制执行数学中的矩阵运算,1×3的矩阵是不能与1×3的矩阵相乘的(左矩阵的列数和右矩阵的行数必须相等)。这时需要将其中一个矩阵转置,使得可以用3×1的矩阵乘以1×3的矩阵,或者是1×3的矩阵乘以3×1的矩阵。NumPy数据类型有一个转置方法,因此可以很方便地进行矩阵乘法运算:

>>> mm*ss.Tmatrix([[14]])    

这里调用了.T方法完成了ss的转置。知道矩阵的大小有助于上述对齐错误的调试,可以通过NumPy中的shape方法来查看矩阵或者数组的维数:

>>> from numpy import shape>>> shape(mm)(1, 3)   

如果需要把矩阵mm的每个元素和矩阵ss的每个元素对应相乘应该怎么办呢?这就是所谓的元素相乘法,可以使用NumPy的multiply方法:

>>> from numpy import multiply>>> multiply(mm, ss)matrix([[1, 4, 9]])    

此外,矩阵和数组还有很多有用的方法,如排序:

>>> mm.sort>>> mmmatrix([[1, 2, 3]])   

注意该方法是原地排序(即排序后的结果占用原始的存储空间),所以如果希望保留数据的原序,必须事先做一份拷贝。也可以使用argsort方法得到矩阵中每个元素的排序序号:

>>> dd=mat([4, 5, 1])>>> dd.argsortmatrix([[2, 0, 1]])    

可以计算矩阵的均值:

>>> dd.mean3.3333333333333335    

再回顾一下多维数组:

>>> jj = mat([[1, 2, 3,], [8, 8, 8]])>>> shape(jj)(2, 3)  

这是一个2×3的矩阵,如果想取出其中一行的元素,可以使用冒号( :)操作符和行号来完成。例如,要取出第一行元素,应该输入:

>>> jj[1,:]matrix([[8, 8, 8]])  

还可以指定要取出元素的范围。如果想得到第一行第0列和第1列的元素,可以使用下面的语句:

>>> jj[1,0:2]matrix([[8, 8]])    

这种索引方法能够简化NumPy的编程。在数组和矩阵数据类型之外,NumPy还提供了很多其他有用的方法。我建议读者浏览完整的官方文档http://docs.scipy.org/doc/。