欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

    ython科学计算与数据处理.ppt

    • 资源ID:6524197       资源大小:277.50KB        全文页数:92页
    • 资源格式: PPT        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    ython科学计算与数据处理.ppt

    1,NumPy,函数库,目录,求和、平均值、方差更改数组的形状与数组堆叠最值和排序多项式函数分段函数统计函数解线性方程组,2,函数库 除了前面介绍的ndarray数组对象和ufunc函数之外,NumPy还提供了大量对数组进行处 理的函数。充分利用这些函数,能够简化程序的逻辑,提高运算速度。,3,求和、平均值、方差,sum()计算数组元素之和,也可以对列表、元组等和数组类似的序列进行求和。当数组是多维时,它计算数组中所有元素的和:,4,a=np.random.randint(0,10,size=(4,5)aarray(7,1,9,6,3,5,1,3,8,2,9,8,9,4,0,9,5,1,7,0)np.sum(a)97,求和、平均值、方差,如果指定axis参数,求和运算将沿着指定的轴进行。在上面的例子中,数组a的第0轴长 度为4,第1轴长度为5。如果axis参数为1,就对每行上的5个数求和,所得的结果是长度为 4的一维数组。如果参数axis为0,就对每列上的4个数求和,结果是长度为5的一维数组。即,结果数组的形状是原始数组的形状除去其第axis个元素:,5,np.sum(a,axis=1)array(26,19,30,22)np.sum(a,axis=0)array(30,15,22,25,5),求和、平均值、方差,上面的例子将产生一个新的数组来保存求和结果,如果希望将结果直接保存到另外一个数组中,可以和ufunc函数一样使用out参数指定输出数组,它的形状必须和结果数组的形状相同。,6,求和、平均值、方差,sum()默认使用和数组的元素类型相同的累加变量进行计算,如果元素类型为整数,就使 用系统的默认整数类型作为累加变量。在32位系统中,累加变量的类型为32 bit整型。因此对整数数组进行累加时可能会出现溢出问题,即数组元素的总和超过了累加变量的取值范围。而对很大的单精度浮点数类型数组进行计算时,也可能出现精度不够的现象,这时可以通过dtype 参数指定累加变量的类型。在下面的例子中,我们对一个元素都为1.1的单精度数组进行求和,比较单精度累加变量和双精度累加变量的计算结果:,7,求和、平均值、方差,8,b=np.ones(1000000,dtype=np.float32)*1.1#创建一个很大的单精度浮点数数组 b#1.1无法使用浮点数精示,存在一些误差array(1.10000002,1.10000002,1.10000002,dtype=float32)np.sum(b)#使用单精度累加变量进行累加计算,误差将越来越大 1110920.5np.sum(b,dtype=np.double)#使用双精度浮点数则能够得到正确的值1100000.0238418579,求和、平均值、方差,mean()用于求数组的平均值,也可以通过axis参数指定求平均值的轴,通过out参数指定输出数组。和sum()不同的是,对于整数数组,它使用双精度浮点数进行计算,而对于其他类型的数组,则使用和数组元素类型相同的累加变量进行计算:,9,np.mean(a,axis=1)#整数数组使用双精度浮点数进行计算 array(5.2,3.8,6.,4.4)np.mean(b)#单精度浮点数使用单精度浮点数进行计算 1.1109205 np.mean(b,dtype=np.double)#用双稍度浮点数计算平均值 1.1000000238418579,求和、平均值、方差,除此之外,average()也可以对数组进行平均计算。它没有out和dtype参数,但有一个指定每个元素权值的weights参数,可在IPython中输入“np.average?”来査看使用说明。std()和var()分别计算数组的标准差和方差,有axis、out及dtype等参数。,10,更改数组的形状与数组堆叠,更改数组的形状:,11,a1=floor(10*random.random(3,4)a1 array(7.,5.,9.,3.,7.,2.,7.,8.,6.,8.,3.,2.)a1.shape(3,4)a1.ravel()#flatten the array array(7.,5.,9.,3.,7.,2.,7.,8.,6.,8.,3.,2.)a1.shape=(6,2)a1.transpose()array(7.,9.,7.,7.,6.,3.,5.,3.,2.,8.,8.,2.),更改数组的形状与数组堆叠,12,a1 array(7.,5.,9.,3.,7.,2.,7.,8.,6.,8.,3.,2.)a1.resize(2,6)a1 array(7.,5.,9.,3.,7.,2.,7.,8.,6.,8.,3.,2.),更改数组的形状与数组堆叠,沿不同轴将数组堆叠在一起:,13,a2=floor(10*random.random(2,2)a2 array(1.,1.,5.,8.)b2=floor(10*random.random(2,2)b2 array(3.,3.,6.,0.)vstack(a2,b2)array(1.,1.,5.,8.,3.,3.,6.,0.)hstack(a2,b2)array(1.,1.,3.,3.,5.,8.,6.,0.)#对那些维度比二维更高的数组,hstack沿着第二个轴组合,vstack沿着第一个轴组合,concatenate允许可选参数给出组合时沿着的轴。,最值和排序,用min()和max()可以计算数组的最大值和最小值,而ptp()计算最大值和最小值之间的差。它们都有axis和out两个参数。这些参数的用法和sum()相同。用argmax()和argmin()可以求最大值和最小值的下标。如果不指定axis参数,就返回平坦化之后的数组下标,例如:,14,np.min(a2)1.0np.max(a2)9.0np.ptp(a2)8.0,最值和排序,可以通过unravel_index()将一维下标转换为多维数组中的下标,它的第一个参数为一维下标值,第二个参数是多维数组的形状:,15,idx=np.unravel_index(2,a.shape)idx(0,2)aidx9,np.argmax(a)#找到数组a中最大值的下标,有多个最值时得到第一个最值的下标 2 a.ravel()2#求平坦化之后的数组中的第二个元素 9,最值和排序,当使用axis参数时,可以沿着指定的轴计算最大值的下标。例如下面的结果表示,在数组 a中,第0行中最大值的下标为2,第1行中最大值的下标为3:下面的语句使用idx选择出每行的最大值:,16,idx=np.argmax(a,axis=1)idxarray(2,3,0,0),axrange(a.shape0),idxarray(9,8,9,9),最值和排序,数组的sort()方法用于对数组进行排序,它将改变数组的内容。而sort()函数则返回一个新数组,不改变原始数组。它们的axis参数默认值都为-1,即沿着数组的最后一个轴进行排序。sort()函数的axis参数可以设置为None,此时它将得到平坦化之后进行排序的新数组。,17,np.sort(a)#对每行的数据进行排序 array(1,3,6,7,9,1,2,3,5,8,0,4,8,9,9,0,1,5,7,9)np.sort(a,axis=0)#对每列的数据进行排序 array(5,1,1,4,0,7,1,3,6,0,9,5,9,7,2,9,8,98,3),最值和排序,argsort()返冋数组的排序下标,axis参数的默认值为-1:用median()可以获得数组的中值,即对数组进行排序之后,位于数组中间位置的值,当长度是偶数时,得到正中间两个数的平均值。它也可以指定axis和out参数:,18,idx=np.argsort(a)idxarray(1,4,3,0,2,1,4,2,0,3,4,3,1,0,2,4,2,1,3,0),np.median(a,axis=0)array(8.,3.,6.,6.5,1.),多项式函数,多项式函数是变量的整数次幂与系数的乘积之和,可以用下面的数学公式表示:f(x)=anxn+an-1xn-1+a2x2+a1x+a0 由于多项式函数只包含加法和乘法运算,因此它很容易计算,并且可以用于计算其他数学函数的近似值。在NumPy中,多项式函数的系数可以用一维数组表示,例如f(x)=x3-2x+1可以用下面的数组表示,其中a0是最高次的系数,a-1是常数项,注意x2的系数为0。,19,a=np.array(1.0,0,-2,1),多项式函数,可以用poly1d()将系数转换为poly1d(一元多项式)对象,此对象可以像函数一样调用,它返回多项式函数的值:,20,p=np.poly1d(a)type(p)p(np.linspace(0,1,5)array(1.,8.515625,0.125,-0.078125,0.),多项式函数,对poly1d对象进行加减乘除运算相当于对相应的多项式函数进行计算。例如:,21,p+-2,1#和 p+np.poly1d(-2,1)相同 poly1d(1.,0.,-4.,2.)p*p#两个3次多项式相乘得到一个6次多项式 poly1d(1.,0.,-4.,2.,4.,-4.,1.)p/1,1#除法返回两个多項式,分别为商式和余式(poly1d(1.,-1.,-1.),poly1d(2.),多项式函数,由于多项式的除法不一定能正好整除,因此它返回除法所得到的商式和余式。上面的例子中,商式为x2-x-1,余式为2。因此将商式和被除式相乘后,再加上余式就等于原来的P:,22,p=np.poly1d(1.,-1.,-1.)*1,1+2 True,多项式函数,多项式对象的deriv()和integ()方法分别计算多项式函数的微分和积分:,23,p.deriv()poly1d(3.,0.,-2.)p.integ()poly1d(0.25,0.,-1.,1.,0.)p.integ().deriv()=p True,多项式函数,多项式函数的根可以使用roots()函数计算:而poly()函数可以将根转换冋多项式的系数:,24,r=np.roots(p)rarray(-1.61803399,1.,0.61803399)p(r)#将根带入多项式计算,得到的值近似为0array(-4.21884749e-15,-4.44089210e-16,-2.22044605e-16),np.poly(r)array(1.00000000e+00,9.99200722e-16,-2.000000000e+00,1.00000000e+00),多项式函数,除了使用多项式对象之外,还可以直接使用NumPy提供的多项式函数对表示多项式系数的数组进行运算。可以在IPython中使用自动补全査看函数名:其中:polyfit()函数可以对一组数据使用多项式函数进行拟合,找到和这组数据最接近的 多项式的系数。,25,np.poly#按 Tab 键np.poly np.polyadd np.polydiv np.polyint np.polysub np.poly1d np.polyder np.polyfit np.polymul np.polyval np.polymul(1,1,1,1)array(1,2,1),多项式函数,计算-pi/2 pi/2区间与sin(x)函数最接近的多项式的系数:(numpy_polyfit.py),26,import numpy as npimport pylab as plpl.figure(figsize=(8,4)x=np.linspace(-np.pi/2,np.pi/2,1000)y=np.sin(x)for deg in 3,5,7:a=np.polyfit(x,y,deg)error=np.abs(np.polyval(a,x)-y)print poly%d:%deg,a print max error of order%d:%deg,np.max(error)pl.semilogy(x,error,label=u%d阶多项式的误差%deg)pl.legend(loc=3)pl.axis(tight)pl.show(),多项式函数,27,poly 3:-1.45021094e-01-6.39518172e-169.88749145e-01-4.29811537e-15max error of order 3:0.00894699976708poly 5:7.57279944e-03-2.50656614e-17-1.65823793e-01-2.72346001e-18 9.99770071e-017.17317591e-18max error of order 5:0.00015740861417poly 7:-1.84445514e-043.70441786e-178.30942467e-03-1.24633291e-16-1.66651593e-017.40085118e-179.99997468e-01-8.11201916e-18 max error of order 7:1.52682558119e-06,分段函数,在上节中介绍了如何使用frompyfunc()函数计算三角波形。由于三角波形是分段函数,需要根据自变量的取值范围决定计算函数值的公式,因此无法直接通过ufunc函数计算它。NumPy提供了一些计算分段函数的方法。Python 2.6中新增了如下的判断表达式语法,当condition条件为True时,表达式的值为y,否则为z:,28,numpy_piecewise.py 用where()和piecewise()计算三角波形,x=y if condition else z,分段函数,在NumPy中,where()函数可以看做判断表达式的数组版本:其中,condition、y和z都是数组,它的返回值是一个形状与condition相同的数组。当 condition中的某个元素为True时,数组x中对应下标的值从数组y获取,否则从数组z获取:,29,x=where(condition,y,z),x=np.arange(10)np.where(x5,9-x,x)array(9,8,7,6,5,5,6,7,8,9),分段函数,如果y和z是单个的数值或者它们的形状与condition的不同,将先通过广播运算使其形状一致:使用where()很容易计算上节介绍的三角波形。,30,np.where(x6,2*x,0)array(0,0,0,0,0,0,0,14,16,18),def triangle_wave(x,c,c0,hc):x=x-x.astype(np.int)#三角波的周期为1,因此只取x坐标的小数部分进行计算 return np.where(x=c,0,np.where(xc0,x/c0*hc,(c-x)/(c-c0)*hc),分段函数,由于三角波形分为三段,因此需要两个嵌套的where()进行计算.由于所有的运算和循环 都在C语言级别完成,因此它的计算效率比frompyfunc()高.随着分段函数的分段数量的增加,需要嵌套更多层where(),但这样做不便于程序的编写 和阅读。可以用select()解决这个问题,它的调用形式如下:,31,select(condlist,choicelist,default=0),分段函数,其中,condlist是一个长度为N的布尔数组列表,choicelist是一个长度为N的储存候选值 的数组列表,所有数组的长度都为M.如果列表元素不是数组而是单个数值,那么它相当于元 素值都相同且长度为M的数组。,32,select(condlist,choicelist,default=0),分段函数,对于从0到M-1的数组下标i,从布尔数组列表中找出满足条件“condlistji=True”的 j的最小值,则“outi=choicelistji”,其中out是select()的返回数组。可以使用select()计算三角波形:,33,def triangle._wave2(x,c,c0,hc):x=x-x.astype(np.int)return np.select(x=c,xc0,True,0,x/c0*hc,(c-x)/(c-c0)*hc),分段函数,由于分段函数分为三段,因此每个列表都有三个元素。choicelist的最后一个元素为True,表示前面所有条件都不满足时,将使用choicelist的最后一个数组中的值。也可以用default参数指定条件都不满足时的候选值数组:但是where()和select()的所有参数都需要在调用它们之前完成计算,因此NumPy会计算下 面4个数组:,34,return np.select(x=c,xc0,0,x/c0*hc,default=(c-x)/(c-c0)*hc),x=c,xc0,x/c0*hc,(c-x)/(c-c0)*hc,分段函数,35,在计算时还会产生许多保存中间结果的数组,因此如果输入的数组x很大,将会发生大量的内存分配和释放。为了解决这个问题,NumPy提供了 piecewise()专门用于计算分段函数,它的调用参数如下,piecewise(x,condlist,funclist),分段函数,参数x是一个保存自变量值的数组.condlist是一个长度为M的布尔数组列表,其中的每个布尔数组的长度都和数组x相同。funclist是一个长度为M或M+1的函数列表,这些函数的 输入和输出都是数组。它们计算分段函数中的每个片段。如果不是函数而是数值,就相当于返 回此数值的函数。每个函数与condlist中下标相同的布尔数组对应,如果funclist的长度为M+l,那么最后一个函数对应于所有条件都为False时。,36,piecewise(x,condlist,funclist),分段函数,下面是使用piecewise()计算三角波形的程序:使用piecewise()的好处在于它只计算需要计算的值.因此在上面的例子中,表达式“x/c0*hc”和“(c-x)/(c-c0)*hc”只对输入数组x中满足条件的部分进行计算。,37,def triangle_wave3(x,c,c0,hc):x=x-x.astype(np.int)return np.piecewise(x,x=c,x=c lambda x:x/c0*hc,#xc0 lambda x:(c-x)/(c-c0)*hc)#else,分段函数,38,#-*-coding:utf-8-*-使用where,select,piecewise等计算三角波形的分段函数。import numpy as npdef triangle_wave(x,c,c0,hc):x=x-x.astype(np.int)#三角波的周期为1,因此只取x坐标的小数部分进行计算 return np.where(x=c,0,np.where(x=c,xc0,True,0,x/c0*hc,(c-x)/(c-c0)*hc),0.4,1.0),分段函数,39,def triangle_wave3(x,c,c0,hc):x=x-x.astype(np.int)return np.piecewise(x,x=c,x=c lambda x:x/c0*hc,#x=c,xc0,0,f1,f2),分段函数,triangle_wave4()验证了每个函数所计算的数组的长度。,40,x=np.linspace(0,2,1000)y=triangle_wave(x,0.6,0.4,1.0)y2=triangle_wave2(x,0.6,0.4,1.0)y3=triangle_wave3(x,0.6,0.4,1.0)y4=triangle_wave4(x,0.6,0.4,1.0),np.alltrue(y=y2)and np.alltrue(y2=y3)and np.alltrue(y3=y4),统计函数,unique():返冋其参数数组中所有不同的值,并按从小到大的顺序排列。它有两个可选参数:retum_index:Ture表示同时返回原始数组中的下标。Retun_inverse:True表示返冋重建原始数组用的下标数组。下面通过实例介绍unique()的用法。首先用randint()创建含有10个元素、值在0到9范围之内的随机整数数组:,41,a=np.random.randint(0,10,10)aarray(1,1,9,5,2,6,7,6,2,9),统计函数,通过unique(a)可以找到数组a中所有的整数,并按照顺序排列:如果参数return_index为True,就返回两个数组,第二个数组是第一个数组在原始数组中的下标:,42,np.unique(a)array(l,2,5,6,7,9),x,idx=np.unique(a,return_index=True)xarray(1,2,5,6,7,9 idxarray(0,4,3,5,6,2),统计函数,数组idx保存的是数组x中每个元素在数组a中的下标:如果参数return_inverse为True,那么返回的第二个数组是原始数组a中每个元素在数组x 中的下标:,43,aidxarray(1,2,5,6,7,9),x,ridx=np.unique(a,return_inverse=True)ridxarray(0,0,5,2,1,3,4,3,1,5)all(xridx=a)#原始数组a和xridx完全相同True,统计函数,bincount():对整数数组中各个元素出现的次数进行统计,它要求数组中所有元素都是非负的。其返回数组中第i个元素的值表示整数i在参数数组中出现的次数。由上面的结果可知,在数组a中有两个1、两个2、一个5、两个6、一个7和两个9,而 0、3、4、8等数没有在数组a中出现。,44,np.bincount(a)array(0,2,2,0,0,1,2,1,0,2),统计函数,通过weights参数可以指定每个数对应的权值。当指定weights参数时,bincount(x,weights=w)返冋数组x中每个整数所对应的w中的权值之和。实例:上面的结果中,1.3是数组x中0所对应的w中的值(0.1和1.2)的和,1.6是1所对应的w 中的值(0.3、0.5和0.8)的和,而0.6是2所对应的w中的值(0.2和0.4)的和.,45,x=np.array(0,1,2,2,1,1,0)w=np.array(0.1,0.3,0.2,0.4,0.5,0.8,1.2)np.bincount(x,w)array(1.3,1.6,0.6):,统计函数,如果要求平均值,可以用求和结果与次数相除:,46,np.bincount(x,w)/np.bincount(x)array(0.65,0.53333333,0.3),统计函数,histogram():对一维数组进行直方图统计,其参数列表如下:其中,a是保存待统计数据的数组,bins指定统计的区间个数,即对统计范围的等分数。range是一个长度为2的元组,表示统计范围的最小值和最大值,默认值为None,表示范围由 数据的范围决定,即(a.min(),a.max().当normed参数为False时,函数返回数组a中的数据在每个区间的个数,否则对个数进行正规化处理,使它等于每个区间的概宇密度。weights参数和 bincount()的类似。,47,Histogram(a,bins=10,range=None,normed=False,weights=None),统计函数,histogram()返回两个一维数组-hist和bin_edges,第一个数组是每个区间的统计结果,第二个数组长度为len(hist)+1,每两个相邻的数值构成一个统计区间。下面我们看一个例子:首先创建了一个一维随机数组a,然后用 histogram()对数组a中的数据进行直方图统计。结果显示有20个元素的值在0到0.2之间,26 个元素的值在0.2到0.4之间.rand()所创建的随机数在0到1范围之间是平均分布的。,48,a=np.random.rand(100)np.histogram(a,bins=5,range=(0,1)(array(20,26,20,16,18),array(0.,0.2,0.4,0.6,0.8,1.),统计函数,如果需要统计的区间长度不等,可以将表示区间分隔位置的数组传递给bins参数,例如:结果表示:0到0.4之间有46个值,0.4對0.8之间有36个值。如果用weights参数指定了数组a中每个元素对应的权值,那么histogram()将对区间中数 值对应的权值进行求和.,49,np.histogram(a,bins=0,0.4,0.8,1.0,range=(0,1)(array(46,36,18),array(0.,0.4,0.8,1.),统计函数,一个使用histogram()统计男青少年年龄和身高的例子。Height.csv(100名年龄在7到20岁之间的男性青少年的身高统计数据)首先用loadtxt()从数据文件载入数据:在数组d中,第0列是年龄,第1列是身高。可以看到年龄的范围在7到20之间:,50,d=np.loadtxt(height.csv“,delimiter=,)d.shape(100,2),np.min(d:,0)7.0999999999999996 np.max(d:,0)19.899999999999999,统计函数,下面对数据进行统计,sums是每个年龄段的身高总和,cnts是每个年龄段的数据个数,因此很容易计算出每个年龄段的平均身高:,51,sums=np.histogram(d:,0,bins=range(7,21),range=(7,20),weights=d:,1)0 cnts=np.histogram(d:,0,bins=range(7,21),range=(7,20)0sums/cntsarray(125.96,132.06666667,137.82857143,143.8,148.14,153.44,162.15555556,166.86666667,172.83636364,173.3,175.275,174.19166667,175.075),解线性方程组,对矩阵的一些更高级运算可以在numpy的线性代数模块linalg中找到。例如inv()计算逆矩阵,solve()可以求解多元一次方程组.下面是solve()的例子:solve()有两个参数a和b。a是一个N*N的二维数组,而b是一个长度为N的一维数使,solve()找到一个长度为N的一维数组X,使得它们满足a x=b,即x就是这个N元一次方程 组的解.。,52,a=np.random.rand(10,10)b=np.random.rand(10)x=np.linalg.solve(a,b)np.sum(np.abs(np.dot(a,x)-b)3.1433189384699745e-15,解线性方程组,lstsq()比solve()更一般化,它不要求矩阵a是正方形的,也就是说方程的个数可以少于、等于或多于未知数的个数。它找到一组解x,使得丨b-a x丨最小。我们称得到的结果为最小二乘解,即它使得所有等式的误差的平方和最小。,53,numpy.linalg.lstsq(a,b,rcond=-1)rcond:float,optional Returns:X:ndarray Least-squares solution.residuals:ndarray Sums of residuals;rank:int Rank of matrixa.s:(min(M,N),)ndarray Singular values ofa.,解线性方程组,54,ExamplesFit a line,y=mx+c,through some noisy data-points:x=np.array(0,1,2,3)y=np.array(-1,0.2,0.9,2.1)A=np.vstack(x,np.ones(len(x).T A array(0.,1.,1.,1.,2.,1.,3.,1.)m,c=np.linalg.lstsq(A,y)0 print m,c 1.0-0.95,解线性方程组,55,Plot the data along with the fitted line:import matplotlib.pyplot as plt plt.plot(x,y,o,label=Original data,markersize=10)plt.plot(x,m*x+c,r,label=Fitted line)plt.legend()plt.show(),56,NumPy,NumPy模块,目录,numpy.linalg模块Nmpy线性代数小结numpy.fft模块numpy.random模块直方图(histogram),57,numpy.linalg模块,numpy.linalg模块包含线性代数的函数。使用这个模块,可以计算逆矩阵、求特征值、解线性方程组以及求解行列式等.计算逆矩阵 在线性代数中,矩阵A与其逆矩阵A-1相乘后会得到一个单位矩阵I。该定义可以写为A*A-1=I。numpy.linalg模块中的inv函数可以计算逆矩阵。按如下步骤来对矩阵求逆。,58,numpy.linalg模块,使用numpy.linalg模块中的inv函数计算了逆矩阵,并检查了原矩阵与求得的逆矩阵相乘的结果确为单位矩阵。inversion.py文件。,59,import numpy as npA=np.mat(0 1 2;1 0 3;4-3 8)#使用mat函数创建示例矩阵print An,Ainverse=np.linalg.inv(A)print inverse of An,inverseprint Checkn,A*inverse,numpy.linalg模块,60,import numpy as npA=np.mat(1-2 1;0 2-8;-4 5 9)print An,Ab=np.array(0,8,-9)print bn,bx=np.linalg.solve(A,b)print Solution,xprint Checkn,np.dot(A,x),求解线性方程组 numpy.linalg中的函数solve可以求解形如 Ax=b 的线性方程组,其中 A 为矩阵,b 为一维或二维的数组,x 是未知变量。,numpy.linalg模块,特征值和特征向量 特征值(eigenvalue)即方程 Ax=ax 的根,是一个标量。其中,A 是一个二维矩阵,x 是一个一维向量。特征向量(eigenvector)是关于特征值的向量。在numpy.linalg模块中,eigvals函数可以计算矩阵的特征值,而eig函数可以返回一个包含特征值和对应的特征向量的元组。,61,numpy.linalg模块,62,import numpy as npA=np.mat(3-2;1 0)print An,Aprint Eigenvalues,np.linalg.eigvals(A)eigenvalues,eigenvectors=np.linalg.eig(A)print First tuple of eig,eigenvaluesprint Second tuple of eign,eigenvectorsfor i in range(len(eigenvalues):print Left,np.dot(A,eigenvectors:,i)print Right,eigenvaluesi*eigenvectors:,i,numpy.linalg模块,在numpy.linalg模块中的svd函数可以对矩阵进行奇异值分解。该函数返回3个矩阵U、Sigma和V,其中U和V是正交矩阵,Sigma包含输入矩阵的奇异值。,63,import numpy as npA=np.mat(4 11 14;8 7-2)print An,AU,Sigma,V=np.linalg.svd(A,full_matrices=False)print Uprint Uprint Sigmaprint Sigmaprint Vprint Vprint Productn,U*np.diag(Sigma)*V,numpy.linalg模块,广义逆矩阵 摩尔彭罗斯广义逆矩阵(Moore-Penrose pseudoinverse)可以使用numpy.linalg模块中的pinv函数进行求解。计算广义逆矩阵需要用到奇异值分解。inv函数只接受方阵作为输入矩阵,而pinv函数则没有这个限制。,64,import numpy as npA=np.mat(4 11 14;8 7-2)print An,Apseudoinv=np.linalg.pinv(A)print Pseudo inversen,pseudoinvprint Check,A*pseudoinv,numpy.linalg模块,行列式 numpy.linalg模块中的det函数可以计算矩阵的行列式。,65,import numpy as npA=np.mat(3 4;5 6)print An,Aprint Determinant,np.linalg.det(A),numpy.linalg模块,矩阵的秩,66,import numpy as np I=np.eye(3)#先创建一个单位阵 I array(1.,0.,0.,0.,1.,0.,0.,0.,1.)np.linalg.matrix_rank(I)#秩 3 I1,1=0#将该元素置为0 I array(1.,0.,0.,0.,0.,0.,0.,0.,1.)np.linalg.matrix_rank(I)#此时秩变成2 2,Nmpy线性代数小结,1.建立矩阵,67,a1=np.array(1,2,3,dtype=int)#建立一个一维数组,数据类型是int。也可以不指定数据类型,使用默认。几乎所有的数组建立函数都可以指定数据类型,即dtype的取值。a2=np.array(1,2,3,2,3,4)#建立一个二维数组。此处和MATLAB的二维数组(矩阵)的建立有很大差别。同样,numpy中也有很多内置的特殊矩阵:b1=np.zeros(2,3)#生成一个2行3列的全0矩阵。注意,参数是一个tuple:(2,3),所以有两个括号。完整的形式为:zeros(shape,dtype=)。相同的结构,有ones()建立全1矩阵。empty()建立一个空矩阵,使用内存中的随机值来填充这个矩阵。b2=identity(n)#建立n*n的单位阵,这只能是一个方阵。,Nmpy线性代数小结,68,b3=eye(N,M=None,k=0)#建立一个对角线是1其余值为0的矩阵,用k指定对角线的位置。M默认None。此外,numpy中还提供了几个like函数,即按照某一个已知的数组的规模(几行几列)建立同样规模的特殊数组。这样的函数有zeros_like()、empty_like()、ones_like(),它们的参数均为如此形式:zeros_like(a,dtype=),其中,a是一个已知的数组。c1=np.arange(2,3,0.1)#起点,终点,步长值。含起点值,不含终点值。c2=np.linspace(1,4,10)#起点,终点,区间内点数。起点终点均包括在内。同理,有logspace()函数,Nmpy线性代数小结,69,d1=panion(a)#伴随矩阵d2=np.linalg.triu()/tril()#作用同MATLAB中的同名函数e1=np.random.rand(3,2)#产生一个3行2列的随机数组。同一空间下,有randn()/randint(

    注意事项

    本文(ython科学计算与数据处理.ppt)为本站会员(牧羊曲112)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开