numpy入门
我们学机器学习,为什么要学numpy库和matplotlib库了?估计这是很多人刚开始跟我一样疑惑。机器学习技术核心就是大数据处理,你需要处理大量的数据进行算法模型训练。因此,我们需要一个能迅速处理大量数据的工具。其实,无论C语言、java等都可以实现机器学习算法,机器学习就是一些数学理论模型用程序实例化,可以来解决很多实际问题。我们选择python语言的一个非常重要的原因,就是其有丰富的大数据处理所用的库,并且程序实现简单。numpy就是其中最基础的一个。
numpy是一个矩阵库,提供了大量的矩阵处理函数。
我们生活中所用的汽车的车架,是一个非常复杂的结构。我们怎么能够保证其能安全可靠了?答案是工程师在机械设计的时候要进行受力分析。复杂结构的受力分析的基础是弹性力学理论,而弹性力学理论的基本上以偏微分方程为主,解偏微分方程是一个非常复杂的过程,记得大学时,一个老教授用2个小时解了一道偏微分方程。聪明的科学家,其实早就发现这个问题了,因此发明了偏微分方程的数值解法。其核心就是利用矩阵计算大量迭代,最后逼近一个真实的解。我们的机器学习也是一样的。
numpy虽然是一个矩阵库,但其共提供两种数据类型:数组和矩阵。
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]])
- 加减:会实现同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]])
- 加减:会实现同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]])
让我们稍微复习一下,线性代数中矩阵的乘法
tips:大家一定得记住这种算法,在以后机器学习的算法要经常遇到 |
如果非要进行每个元素相乘,怎么办?也有办法
>>> from numpy import multiply
>>> multiply(mat1,mat2)
matrix([[ 3, 4, 3],
[12, 10, 6],
[21, 16, 9]])
终于写完
下个笔记要更加深入一点了,这个先入个门