A.3 NumPy 概述
虽然安装了NumPy库,但你可能会有疑问:这个库的功能是什么?学术地说:NumPy是一种Python的矩阵类型,在它上面可以进行很多功能运算。通俗地说:这是一个使晕眩更容易、执行更快的库,因为执行是用C来完成的,这比Python的运算速度要快很多。
尽管NumPy被称为矩阵库,但它有2个基本的数据类型:数组(array)和矩阵(matrix)。对数组和矩阵的操作略有不同,如果你之前使用过MATLAB,你应该对矩阵更熟悉一些。这两种数据类型都不需要使用循环操作符号,但是当只有用Python时,你是离不开循环操作符号的。在NumPy中,你可以进行下面的数组运算:
>>> from numpy import array
>>> mm=array((1, 1, 1))
>>> pp=array((1, 2, 3))
>>> pp+mm
array([2, 3, 4])
这个功能如果在Python中,是要通过for循环来实现的。
这里举一个例子,为每个数字乘以常数2:
>>> pp*2
array([2, 4, 6])
为每个数字求平方:
>>> pp**2
array([1, 4, 9])
可以像访问list的元素一样访问数组中的元素:
>>> pp[1]
2
也可以创建一个多维的数组:
>>> jj = array([[1, 2, 3], [1, 1, 1]])
也可以像访问lists一样访问:
>>> jj[0]
array([1, 2, 3])
>>> jj[0][1]
2
同样地,也可以像访问矩阵的元素一样:
>>> jj[0,1]
2
将2个数组相乘时,是将第1个数组中的元素乘上第2个数组中的元素:
>>> a1=array([1, 2,3])
>>> a2=array([0.3, 0.2, 0.3])
>>> a1*a2
array([ 0.3, 0.4, 0.9])
接下来讨论矩阵:
同数组类似,需要导入NumPy的matrix和mat:
>>> from numpy import mat, matrix
NumPy的关键字mat是matrix的简写:
>>> ss = mat([1, 2, 3])
>>> ss
matrix([[1, 2, 3]])
>>> mm = matrix([1, 2, 3])
>>> mm
matrix([[1, 2, 3]])
可以将Python的lists转换成NumPy的矩阵:
>>> pyList = [5, 11, 1605]
>>> mat(pyList)
matrix([[ 5, 11, 1605]])
下面试着将2个矩阵相乘:
>>> mm*ss
Traceback (most recent call last):
File "", line 1, in
File "c:\Python27\lib\site-packages\numpy\matrixlib\defmatrix.py",
line 330, i
n __mul__
return N.dot(self, asmatrix(other))
ValueError: objects are not aligned
执行这个语句时产生了一个错误。矩阵类型的运算严格遵守矩阵的数学运算规则。你不可以用1X3的矩阵乘以1X3的矩阵,其中一个矩阵需要进行转置,你可以将3X1的矩阵乘以1X3的矩阵或将1X3的矩阵乘以3X1的矩阵。NumPy的矩阵类型有一个转置方法,从而轻松实现该乘法运算:
>>> mm*ss.T
matrix([[14]])
我们运用.T方法对ss矩阵实现了转置。
当调试算法错误时,如果知道维数是很有用的。如果想知道数组或矩阵的维数,可以使用NumPy中的shape:
>>> from numpy import shape
>>> shape(mm)
(1, 3)
如何实现矩阵mm中的每个元素乘上ss中的每个元素呢?这就是element-wise multiplication,它可以用NumPy的multiply方法实现:
>>> from numpy import multiply
>>> multiply(mm, ss)
matrix([[1, 4, 9]])
矩阵类型和数组类型还有很多其他有用的方法,例如:
>>> mm.sort()
>>> mm
matrix([[1, 2, 3]])
注意:这个方法会改变矩阵的实际顺序,如果你希望保留原先的顺序,在执行此方法之前,必须做数据备份。你也可以使用argsort()方法来找到排序前的元素位置:
>>> dd=mat([4, 5, 1])
>>> dd.argsort()
matrix([[2, 0, 1]])
你也可以计算矩阵中的numbers的mean:
>>> dd.mean()
3.3333333333333335
接下来,看看多维数组:
>>> jj = mat([[1, 2, 3,], [8, 8, 8]])
>>> shape(jj)
(2, 3)
这是一个2X3的矩阵。如果想得到一行中的所有元素,可以使用冒号(:)运算符和行号。例如:得到第1行的所有元素的语句是:
>>> jj[1,:]
matrix([[8, 8, 8]])
也可以获取一个范围内的元素。得到第1行、第0~1列的所有元素的语句如下:
>>> jj[1,0:2]
matrix([[8, 8]])
用NumPy中的方法可以简化Python编程的语句。
除了数组和矩阵,NumPy还有很多其他有用的功能,可以参考这份文档:
部分译自《Machine Learning in Action》
版权声明:本文为原创文章,未经允许不得转载。