美文网首页我爱编程机器学习成长记
[原创]机器学习从Python开始(三)——NumPy 概述

[原创]机器学习从Python开始(三)——NumPy 概述

作者: 机器学习成长记 | 来源:发表于2018-02-06 00:38 被阅读0次

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还有很多其他有用的功能,可以参考这份文档:

http://docs.scipy.org/doc/

部分译自《Machine Learning in Action》

版权声明:本文为原创文章,未经允许不得转载。

相关文章

网友评论

    本文标题:[原创]机器学习从Python开始(三)——NumPy 概述

    本文链接:https://www.haomeiwen.com/subject/inswzxtx.html