您的位置:首页 > 编程语言 > Python开发

机器学习笔记(五):numpy入门

2016-11-25 12:45 218 查看

numpy入门

我们学机器学习,为什么要学numpy库和matplotlib库了?估计这是很多人刚开始跟我一样疑惑。机器学习技术核心就是大数据处理,你需要处理大量的数据进行算法模型训练。因此,我们需要一个能迅速处理大量数据的工具。其实,无论C语言、java等都可以实现机器学习算法,机器学习就是一些数学理论模型用程序实例化,可以来解决很多实际问题。我们选择python语言的一个非常重要的原因,就是其有丰富的大数据处理所用的库,并且程序实现简单。numpy就是其中最基础的一个。

numpy是一个矩阵库,提供了大量的矩阵处理函数。

我们生活中所用的汽车的车架,是一个非常复杂的结构。我们怎么能够保证其能安全可靠了?答案是工程师在机械设计的时候要进行受力分析。复杂结构的受力分析的基础是弹性力学理论,而弹性力学理论的基本上以偏微分方程为主,解偏微分方程是一个非常复杂的过程,记得大学时,一个老教授用2个小时解了一道偏微分方程。聪明的科学家,其实早就发现这个问题了,因此发明了偏微分方程的数值解法。其核心就是利用矩阵计算大量迭代,最后逼近一个真实的解。我们的机器学习也是一样的。

numpy虽然是一个矩阵库,但其共提供两种数据类型:数组和矩阵。

numpy入门
python常用的数据类型
元组tuple
创建

取值

常用方法

列表list
创建

取值

常用方法

字典dict
创建

取值

常用方法

数组array
创建

元素访问

常用方法

矩阵matrix
创建

元素访问

常用方法

python常用的数据类型

在正式开始numpy库学习之前,我们先来回顾一个python中几个序列类型的数据类型。主要有:元组、列表、字典。让我们迅速的复习一下:

元组(tuple)

创建

>>>t1=()#创建一个空元组
>>>t1
()
>>>t2=(1,)#创建一个单值元组
>>>t2
(1,)
>>>t3=(1,2,3)#纯数字
>>>t3
(1,2,3)
>>>t4=('bamboo',26,'male')#可以为字符串
>>> t4
('bamboo', 26, 'male')


取值

#索引取值
>>> t3[0]
1
>>> t3[1]
2
>>> t4[0]
'bamboo'


常用方法

>>> len(t1)#求元组长度
0
>>> len(t3)
3
>>> t3*2
(1, 2, 3, 1, 2, 3)
>>> max(t3)#求元组中的最大值
3
>>> min(t3)#求元组中的最小值
1
>>> type(t3)#查看类型
<type 'tuple'>


元组中的值不可以修改

列表(list)

创建

>>> list1=[1,2,3]
>>> list1
[1, 2, 3]
>>> list2=['my','name','is','bamboo']#可以为字符串,元组
>>> list2
['my', 'name', 'is', 'bamboo']


取值

>>> list2[0]#索引取值
'my'
>>> list1[0]
1


常用方法

>>> len(list1)#求长度
3
>>> max(list1)#求最大值
3
>>> min(list1)#求最小值
1
>>> type(list1)#查看类型
<type 'list'>
>>> list1.append(4)#项列表中添加一个元素
>>> list1
[1, 2, 3, 4]
>>> list1.remove(3)#删除一个元素
>>> list1
[1, 2, 4]
>>> list1=[1,2,3,4]
>>> list1
[1,2,3,4]
>>> list1.remove(list1[3])#删除一个元素
>>> list1
[1,2,3]
>>> list1[2]=1#给元素重新赋值
>>> list1
[1, 2, 1]


1、列表可以删除和修改内部元素。2、注意观察删除一个元素的操作,需要直接删除其值

字典(dict)

创建

>>> dict1={1:'a',2:'b',3:'c'}#创建一个字典
>>> dict1
{1: 'a', 2: 'b', 3: 'c'}


取值

>>> dict1.keys()#返回key列表
[1, 2, 3]
>>> dict1.values()#返回value列表
['a', 'b', 'c']
>>> dict1.items()#返回键值对列表
[(1, 'a'), (2, 'b'), (3, 'c')]
>>> dict1.iterkeys()#key列表迭代器
<dictionary-keyiterator object at 0x0216F8A0>
>>> dict1.itervalues()#value列表迭代器
<dictionary-valueiterator object at 0x0216F750>
>>> dict1.iteritems()#键值对迭代器
<dictionary-itemiterator object at 0x0216F8A0>
#迭代器取值的方法
>>> iter_key=dict1.iterkeys()
>>> iter_key.next()
1
>>> iter_key.next()
2
>>> iter_key.next()
3
>>> iter_key.next()#当迭代器内值取完后,会报异常
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration


常用方法

>>> len(dict1)#求长度
3
>>> dict1.get(1)#通过键值,获得value
'a'
>>> dict1.get(4,'d')#通过键值,获得value。如果key值不存在,就返回默认值
'd'
>>> dict1#通过get方法取值后,原字典不发生变化
{1: 'a', 2: 'b', 3: 'c'}


数组(array)

标准安装的Python中用列表(list)保存一组值,可以用来当作数组使用,不过由于列表的元素可以是任何对象,因此列表中所保存的是对象的指针。这样为了保存一个简单的[1,2,3],需要有3个指针和三个整数对象。对于数值运算来说这种结构显然比较浪费内存和CPU计算时间。NumPy的诞生弥补了这些不足。

创建

创建numpy的array类型数据时,首先要导入所用到的库。导入方式有两种。

第一是,直接导入array模块

>>> from numpy import array


这样就可以直接利用,array创建数组。

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


第二是,你可以导入numpy库,再用numpy.array创建数组。

>>> import numpy as np
>>> array1=np.array([1,2,3])
>>> array1
array([1, 2, 3])


两种方法都能创建出数组,最后结果都是一样的。

在机器学习中,我们更多的是创建多维数组,其实也很简单。

>>> array2=array([[1,2,3],[4,5,6],[7,8,9]])#创建多维数组
>>> array2
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])


元素访问

array的元素访问的方式有两种:

第一,同list一样,通过索引访问

>>> array1[0]
1
>>> array2[0]
array([1, 2, 3])
>>> array2[0][1]
2


第二,按照矩阵方式访问

>>> array2[0,1]
2


第三,取出一行或者一列

>>> x
array([[ 0.92830929,  0.08101871],
[ 0.88281788,  0.98998765],
[ 0.56750088,  0.48316892]])
>>> x[:,0]#取出一列
array([ 0.92830929,  0.88281788,  0.56750088])


常用方法

求数组的大小。

len()方法也可以求出数组的大小,但当遇到多维数组时,只能求出第一个参数。

>>> array1.shape
(3,)
>>> array2.shape
(3, 3)
>>> len(array1)
3
>>> len(array2)
3


神奇的加减乘除

大家很容易将array和list搞混淆。主要区别在运算上,并且array运算速度更快

array:加减乘除都是对每个元素操作

list:是把list做为一个整体来操作的

让我们先定义两个arrary及两个list

>>> array1=array([1,2,3])
>>> array2=array([1,2,3])

>>> list1=[1,2,3]
>>> list2=[1,2,3]


加法运算:不但可以array和一个数字相加,也可以将两个array相加。list会做为一个整体,同字符串相加一样将2个list连接起来

>>> array1+2#直接与数字相加,给每个元素加一个数值
array([3, 4, 5])

>>> array1+array2#array加法
array([2, 4, 6])

>>> list1+list2#list加法
[1, 2, 3, 1, 2, 3]


减法运算:相当于加一个负数。而list会报错

>>> array1-1#直接与数字相减,同加法相同,会个每个元素减一个数
array([0, 1, 2])

>>> array1-array2#array减法
array([0, 0, 0])

>>> list1-list2#list不能实现减运算,会报异常
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for -: 'list' and 'list'


乘法运算:乘法也很简单,也可以实现同数字运算,也可以与array运算,也是将各个元素分别相乘。

由于list不能进行乘法就不在列举

>>> array1*2#array乘法
array([2, 4, 6])

>>> list1*2#list乘法,会将两个list连接起来
[1, 2, 3, 1, 2, 3]

>>> array1*array2
array([1, 4, 9])


除法运算

除法运算同上

>>> array1/2#array除法
array([0, 1, 1])

>>> array1/array2
array([1, 1, 1])


乘方运算:乘方运算是个非常常用的运算,在这儿列举一下

>>> array1**2#array的乘方运算
array([1, 4, 9])


tips: array运算都是针对各个元素的

矩阵(matrix)

创建

矩阵的创建同数组相同,传入列表即可。注意是:两个括号的列表

>>> from numpy import mat,matrix
>>> mat2#一维矩阵
matrix([[1, 2, 3]])
>>> mat3=matrix([[1,2,3],[4,5,6],[7,8,9]])#多维矩阵
>>> mat3
matrix([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])


元素访问

在矩阵中,你可以返回其中一个元素,也可以返回其中一行。

1、返回一个元素

>>> mat2[0,1]
2
>>> mat2[0,:]
matrix([[1, 2, 3]])
>>> mat3[1,2]
6


2、返回矩阵中的其中一行

>>> mat3[2,:]#返回一行
matrix([[7, 8, 9]])


常用方法

求矩阵的大小:同样也是用shape参数,得到:(行数,列数)

>>> mat2.shape
(1, 3)
>>> mat3.shape
(3, 3)
>>> mat3.shape[0]
3
>>> mat3.shape[1]
3
>>> mat2.shape[0]
1
>>> mat2.shape[1]
3


神奇的加减乘除

看了array的加减乘除是不是觉得很实用,很方便了。

但是矩阵的加减乘除可以分为两种:数字+矩阵矩阵+矩阵

– 那就先来说数字+矩阵

创建个矩阵来实验

>>> mat1=mat([[1,2,3],[4,5,6],[7,8,9]])
>>> mat1
matrix([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])


⎡⎣⎢147258369⎤⎦⎥(mat1)

加减:会实现同array一样的效果,减法相当于加个负数不再举例

>>> mat1+1
matrix([[ 2,  3,  4],
[ 5,  6,  7],
[ 8,  9, 10]])


乘除:同上

>>> mat1*2
matrix([[ 2,  4,  6],
[ 8, 10, 12],
[14, 16, 18]])
>>> mat1/0.5
matrix([[  2.,   4.,   6.],
[  8.,  10.,  12.],
[ 14.,  16.,  18.]])


矩阵+矩阵

再创建个矩阵来实验

>>> mat2=mat([[3,2,1]])


[321](mat2)

加减:会实现同array一样的效果,会给每行对应的元素加,减法相当于加个负数不再举例

>>> mat1+mat2
matrix([[ 4,  4,  4],
[ 7,  7,  7],
[10, 10, 10]])


乘法:

>>> mat1*mat2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python27\lib\site-packages\numpy\matrixlib\defmatrix.py", line 341, i
n __mul__
return N.dot(self, asmatrix(other))
ValueError: objects are not aligned


咦,貌似刚才用法不起作用了。那是肯定的,如果继续一样,就没有必要创建矩阵这个类了。让我们把大学线性代数再捡回来。记得老师说过这么一句话:

两个矩阵相乘必须是这种(x,m)*(m,y)格式,即第一个矩阵的列数=第二个矩阵的行数
那么这个两个矩阵怎么相乘了?mat1.shape=(3,3),mat2.shape=(1,3)。如果我们把mat2掉个方向变成竖的,是不是就可以了。这个方法在线性代数上我们叫转置(mat2.T)

是不是可以了?

>>> mat1*mat2.T
matrix([[10],
[28],
[46]])


让我们稍微复习一下,线性代数中矩阵的乘法

⎡⎣⎢321⎤⎦⎥(mat3)

⎡⎣⎢147258369⎤⎦⎥⎡⎣⎢321⎤⎦⎥=⎡⎣⎢1×3+2×2+3×14×3+5×2+6×17×3+8×2+9×1⎤⎦⎥=⎡⎣⎢102846⎤⎦⎥

tips:大家一定得记住这种算法,在以后机器学习的算法要经常遇到
如果非要进行每个元素相乘,怎么办?也有办法

>>> from numpy import multiply
>>> multiply(mat1,mat2)
matrix([[ 3,  4,  3],
[12, 10,  6],
[21, 16,  9]])


终于写完

下个笔记要更加深入一点了,这个先入个门
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  机器学习 python numpy