ython科学计算与数据处理.ppt
《ython科学计算与数据处理.ppt》由会员分享,可在线阅读,更多相关《ython科学计算与数据处理.ppt(92页珍藏版)》请在三一办公上搜索。
1、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
2、)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),求和、平均值、方差,上面的例子将产生一个新的数组来保存求和结果,如果希望将结果直接保存到
3、另外一个数组中,可以和ufunc函数一样使用out参数指定输出数组,它的形状必须和结果数组的形状相同。,6,求和、平均值、方差,sum()默认使用和数组的元素类型相同的累加变量进行计算,如果元素类型为整数,就使 用系统的默认整数类型作为累加变量。在32位系统中,累加变量的类型为32 bit整型。因此对整数数组进行累加时可能会出现溢出问题,即数组元素的总和超过了累加变量的取值范围。而对很大的单精度浮点数类型数组进行计算时,也可能出现精度不够的现象,这时可以通过dtype 参数指定累加变量的类型。在下面的例子中,我们对一个元素都为1.1的单精度数组进行求和,比较单精度累加变量和双精度累加变量的计算
4、结果:,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参数指定求平均值的轴,通
5、过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参数,但有一个指定每个元素权值
6、的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.transpo
7、se()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.)
8、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参数,就返回平坦化之后的数组
9、下标,例如:,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行中最
10、大值的下标为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
11、,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),n
12、p.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(一元多
13、项式)对象,此对象可以像函数一样调用,它返回多项式函数的值:,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.
14、,-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
15、()函数计算:而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提供的多项式函数对表示多项式系数的数组进行运算。可以在IPytho
16、n中使用自动补全査看函数名:其中: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
17、 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.s
18、how(),多项式函数,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
19、-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
20、.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是单个的数值或者它们的形状与
21、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语言级别完成,因此
22、它的计算效率比frompyfunc()高.随着分段函数的分段数量的增加,需要嵌套更多层where(),但这样做不便于程序的编写 和阅读。可以用select()解决这个问题,它的调用形式如下:,31,select(condlist,choicelist,default=0),分段函数,其中,condlist是一个长度为N的布尔数组列表,choicelist是一个长度为N的储存候选值 的数组列表,所有数组的长度都为M.如果列表元素不是数组而是单个数值,那么它相当于元 素值都相同且长度为M的数组。,32,select(condlist,choicelist,default=0),分段函数,对于从0到
23、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
24、的最后一个数组中的值。也可以用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()专门用于计算分段函数,它的调用参数如下,pie
25、cewise(x,condlist,funclist),分段函数,参数x是一个保存自变量值的数组.condlist是一个长度为M的布尔数组列表,其中的每个布尔数组的长度都和数组x相同。funclist是一个长度为M或M+1的函数列表,这些函数的 输入和输出都是数组。它们计算分段函数中的每个片段。如果不是函数而是数值,就相当于返 回此数值的函数。每个函数与condlist中下标相同的布尔数组对应,如果funclist的长度为M+l,那么最后一个函数对应于所有条件都为False时。,36,piecewise(x,condlist,funclist),分段函数,下面是使用piecewise()计算三
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ython 科学 计算 数据处理
链接地址:https://www.31ppt.com/p-6524197.html