Python数据分析与数据挖掘 课件 第4、5章 类与对象、NumPy模块的基础与应用_第1页
Python数据分析与数据挖掘 课件 第4、5章 类与对象、NumPy模块的基础与应用_第2页
Python数据分析与数据挖掘 课件 第4、5章 类与对象、NumPy模块的基础与应用_第3页
Python数据分析与数据挖掘 课件 第4、5章 类与对象、NumPy模块的基础与应用_第4页
Python数据分析与数据挖掘 课件 第4、5章 类与对象、NumPy模块的基础与应用_第5页
已阅读5页,还剩102页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第4章类与对象主讲人:***15-10月-23Python数据分析与数据挖掘目录contents面向对象0102类和对象03类定义与使用04属性方法05继承0706运算符重载面向对象014.1面向对象面向对象定义:是针对面向过程这一思想的不足所提出的,是指以“对象”为核心反映现实中的事物,并以对象之间的消息传递描述事物之间的关系,从而构建程序。实施过程:首先依据对现实需求的分析抽象提取出多个对象,然后为其增加相应的属性和功能,从而达到让对象实现相关的动作。应用:数据库系统、交互式界面、应用结构、应用平台、分布式系统、网络管理结构、CAD技术、人工智能等多个领域。优点:较于面向过程,更适用于复杂化的程序,且易维护、易复用、易扩展,思维逻辑更加贴近于现实生活,更容易解决大型的复杂的业务逻辑。面向过程定义:它是以解决问题的过程为核心进行编程,是一种自顶向下、逐步细化的过程,更侧重于过程之间的关系。存在问题:面对复杂的问题时,过程之间相互调用,步骤流程错综复杂,面向过程就很难解决,或者代码会特别繁杂。类和对象024.2类和对象Python作为面向对象的语言,其实现基础就是类和对象。类(class)是指具有相似特征和行为的事物的集合,是一种广义的数据类型,支持定义复杂数据的特性,包括静态特性(即数据抽象)和动态特性(即行为抽象,也就是对数据的操作方法),如:正方形、平行四边形都属于四边形这一类,而四边形的周长和面积则是对应的操作。对象是现实中该类事物的一个个体,是类的实例。一个类可以支持多个对象的创建,而创建类的一个实例的过程被称为实例化。例如:鸟类是一个类,其中具备性别,年龄等属性,会飞,鸣叫等是方法,而喜鹊、凤凰、鹦鹉等鸟类是几个对象。4.2类和对象类与对象的区别之处:类是对象的抽象,而对象是类的具体实例。类是抽象的,而对象是具体的。每一个对象都是某一个类的实例。每一个类在某一时刻都有零或更多的实例。类是静态的,它们的存在、语义和关系在程序执行前就已经定义好了,对象是动态的,它们在程序执行时可以被创建和删除。类是生成对象的模板。类定义与使用034.3类定义与使用类通过class定义,定义时类名一般需要首字母大写。定义格式如下:class类名:

属性名=属性值 def__init__(self,x,y): self.XXX=x self.XXX=y

def方法名(self):

方法体 def方法名(self):

方法体说明:定义类与内置类地位相同,可以出现在代码中的任何位置,最常见的是出现在模块外层,通过import语句导入并使用。类属性,是在类中方法之外定义的,可通过类名访问。此外,类属性也可通过对象访问,但一般不建议这样做,容易导致类属性值不一致的情况。类方法,是对动态特征的抽象,一个类中可定义多个不同的方法,而每个方法的第一个参数都是self,其代表要创建的对象本身。此外,类方法只能通过对象来调用,即向类发消息请求对象执行某个方法。class类名:

属性名=属性值

def__init__(self,x,y): self.XXX=x self.XXX=y def方法名(self):

方法体 def方法名(self):

方法体说明:构造函数(__init__)初始化程序,通常在创建和初始化这个类的新对象时被调用,Python提供一个默认的构造函数。如果类中没有显性定义__init__()方法,则创建对象时调用默认方法,不做任何操作,直接返回一个对象;如果类中显性定义了__init__()方法,则创建对象时会优先调用显式方法。__init__()方法的第一个参数是self,表示正在创建的对象,可以通过方法体中的语句实现为对象的属性赋值。该方法还可以有多个参数,创建对象时需要为这些参数提供实际值,从而实现对象属性的操作。4.3类定义与使用类的使用是在主函数,具体语法格式如下:对象名=类名()对象名.方法名()【分析】:类定义放在CLASS.py文件中,在本例中使用到其中的Student类,采用导入模块的形式将其导入。利用“Student”类创建一个对象名为“zhangsan”的对象,创建时采用Python默认的构造函数,并通过“类名.属性”和“对象名.方法名”的方式访问类属性(age)和对应的方法(learning()和play()方法)。[例4-1]类的定义实例。4.3类定义与使用【分析】:类定义放在CLASS.py文件中,在本例中使用到其中的Student_new类。在类定义中定义了类属性(age)、对象属性(weight和height)和方法(BMI())。在主函数中创建一个名为“wangwu”的对象,创建时采用显式定义的构造函数__init__,并将其初始化,传入对象的身高和体重。以“对象名.属性”和“对象名.方法名”的方式访问类属性和对应的方法,同时在主函数中修改属性值。[例4-2]类的定义实例。4.3类定义与使用属性044.4.1实例属性和类属性类属性:在定义类中且在方法之外定义的属性,是所有类的对象都具有的属性。通常情况下,类属性一般通过类名进行访问,也可通过对象名进行类属性的访问,但一般不推荐,容易造成属性值不一致的情况。同时可在主函数中直接修改属性值或者直接添加属性,如“Student”类中的“age”属性。实例属性:定义在构造函数__init__中的属性,定义时以self为前缀。实例属性是描述某一对象特征的数据,故而只专属于对象的属性,也只能通过对象名访问,如Student_new类中的self.weight和self.height属性。实例属性的设置也比较灵活,可以在定义类中的__init__方法中设置,也可在主函数中直接添加修改。[例4-3]类的实例属性与类属性实例。(Student_new参照4-2)【分析】:类定义放在CLASS.py文件中,在本例中使用到其中的Studen_new类。创建对象时采用显式定义的构造函数__init__,并通过“对象名.属性”和“对象名.方法名”的方式访问类属性和对应的方法。同时在主函数中对已有的类属性和实例属性修改,并新增类属性(sex)和实例属性(score)。4.4.1实例属性和类属性在有时,类中的一些属性不希望对外公开,因此屏蔽一些属性值在实现功能时有较大意义。Python中默认的成员函数和成员变量都是公开的,其中的私有属性和方法没有类似Java中public、private等关键词来修饰,所以仅以编程来实现区分。私有属性:属性名前有前缀“__”的属性,一般情况下,只能在类的内部调用,但也可以在类外部以“实例名._类名__私有属性名”的方式访问。公有属性:除私有属性外,其余均为公有属性。4.4.2公有属性和私有属性[例4-4]类的共有属性和私有属性实例。【分析】:在本例中使用到其中的Student_private类。定义类中分别定义了私有属性(__age和__weight)和公有属性,并在方法中直接调用了私有属性(__age属性)。创建对象时采用显式定义的构造函数__init__,并通过“对象名.属性”和“对象名.方法名”的方式访问公有的类属性和对应的方法,但不适用于私有方法的访问,否则会报错。4.4.2公有属性和私有属性[例4-4]类的共有属性和私有属性实例。(以下是错误示范)4.4.2公有属性和私有属性用户不能用wangwu.__weight方式访问学生体重,然而用户也就知道了__weight是个私有变量。我们有没有一种方法让用户通过wangwu.weight来访问学生分数同时继续保持__weight私有变量的属性呢?这时我们可以借助python的@property装饰器。[例4-5]装饰器实例。注意:一旦给函数加上装饰器@property,调用函数的时候可以不加括号直接调用。4.4.2公有属性和私有属性方法054.5方法实例方法:在类中定义的,一般以self作为第一个参数,self代表调用这个方法的对象本身,相当于Java中this的效果,而在方法调用时,可以不用传入self参数,Python会自动将调用这个方法的对象作为参数传入,这也进一步说明实例方法只可以通过对象进行调用。在类定义中,可以通过self关键词实现对象属性的修改,当方法体中的属性与类属性同名时,会覆盖类属性的值。类方法:使用修饰器@classmethod修饰的方法,它的第一个参数是“cls”,表示类本身,作用如同self。类方法可以通过类名或对象名调用。静态方法:是使用修饰器@staticmethod修饰的方法,该方法既不需要对象参数self,也不需要类参数cls,所以该方法没有默认参数。在调用静态方法时,可以通过类名或对象名来调用。4.5.1实例方法[例4-6]实例方法实例。【分析】:在本例中,类定义放在CLASS.py文件中,在本例中使用到其中的Cars类,Cars类中的类属性与方法中的属性同名(即“price”属性),创建c1对象.从结果可以看出,在访问Price_used()方法之前,使用c1对象访问的price属性值为100,说明访问的是类属性。在调用对象方法后,再使用c1对象访问的price属性值为80,此时访问的是对象方法中的同名属性。4.5.2类方法[例4-7]类方法实例。【分析】:类定义放在CLASS.py文件中,在本例中使用到其中的Books类,类声明中分别定义了实例方法(sell_one())和类方法(sell_two())。从前2个调用结果看,在调用实例方法(sell_one)后,类属性的值没发生改变,但调用类方法(sell_two)后,类的属性值发生变化;对比后2个调用结果,可见类和对象都可调用类方法。4.5.3静态方法[例4-8]静态方法实例。【分析】:从运行结果来看,类和对象均可实现静态方法的调用。继承064.6类的继承继承是面向对象的一个重要特征,反映类与类之间的一种所属关系,其中已经存在的定义类一般称为“父类”,而将要在父类基础上定义的类称为“子类”。当子类具有与父类相同的属性和方法时,不需要重复相同的代码,只需直接定义新增的特征或方法。例如:在“学生”类的基础上再定义新的子类“小学生”、“中学生”或“大学生”。这些子类完全拥有“学生”类的属性和方法。如果父类中有私有属性或方法时,子类不能继承。继承使用的语法格式为:class父类名:

方法体class子类名(父类名):

方法体注:子类定义中的父类名表示其继承自哪一个父类,可以是简单的单个类名,也可以是多个类名,还可以是复杂的表达式,只要值是类对象。当有多个类名时,中间以逗号“,”隔开,也表示子类继承自多个父类,称为多继承。4.6.1隐形继承1、隐性继承是指子类完全继承父类的全部属性与方法,没有在子类方法体中定义其他的属性或方法,从而子类具有和父类一样的特征与功能,但如果父类中含有私有属性或方法时,子类并不能继承。【分析】:本代码定义一个Animal类,类中定义了属性foot和eating()方法,并输出一个字符串。然后又定义一个Bird类,继承自Animal类,方法体中没有新增任何其他方法或属性。最后又创建了一个magpie对象,并访问其foot属性与eating()方法。[例4-9]隐性继承实例。结论:子类对象不能直接访问父类的私有属性和私有方法。子类对象可以通过访问父类方法从而间接访问父类的私有属性。[例4-10]子类对象访问父类实例。4.6.1隐形继承4.6.2覆盖2、覆盖

在子类与父类的继承关系中,会出现子类方法名与父类方法名同名的情况,但其功能却不一样,在调用该方法时父类方法被完全覆盖,即对象调用了子类中的同名方法。【分析】:初始化一个子类对象,调用born()方法,结果显示执行的是子类定义中的方法。[例4-11]覆盖实例。4.6.3

super继承3、super继承:如果子类和父类有同名方法时,子类的方法会将父类方法覆盖。而在实际需要中,我们有时需要调用父类的同名方法,这就需要用到super关键字。

super函数经常使用在子类构造函数__init__()的重写上,其使用格式如下:

super().XXX()

注意:XXX()为方法名。这种形式不带任何参数,其一般出现在子类方法的定义里,在调用这一方法时,解释器会先找到这一对象的直接父类,再在父类中开始找寻XXX()方法,并执行,然后再执行所在子类方法。【分析】:magpie对象要求调用born()方法,这一方法是指子类中的方法,其方法体中含有super().born(),所以解释器从magpie所属父类(Animal)开始查找born()方法,并执行,之后解释器才执行子类的born()方法中的内容。4.6.3

super继承[例4-12]super继承实例。4、多重继承是指子类不仅仅可以继承一个父类,还可以继承多个父类。例如:青蛙,既可以在陆地生活,也可以在水中生活。【分析】:首先申明是2个父类,其类的定义中均包含相同的属性(foot)和方法(get_foot()),以及不同名的方法。子类Frog的定义中指明了属性和方法继承至哪个父类。主函数中分别访问了两个父类的方法及同名方法。结果显示,Frog类的对象同时继承了两个父类的方法。4.6.4多重继承[例4-12]super继承实例。运算符重载074.7运算符重载Python中允许用户使用一些特定的方法实现运算符重载,从而使类的实例对象支持Python的各种内置操作。方法说明运算符__add__(self,num)加法self+num__sub__(self,num)减法Self-num__mul__(self,num)乘法Self*num__mod__(self,num)取余Self%num__pow__(self,num)幂运算Self**num__truediv__(self,num)除法Self/num__radd__(self,num)加法num+self__iadd__(self,num)加法self+=num__and__(self,num)位与self&num__or__(self,num)位或self|num运算符重载方法(部分)4.7运算符重载[例4-14]运算符重载实例。【分析】:本例中定义了一个Calculator类,并重载__add__()和__sub__()方法,初始化一个对象后,对其进行加减运算。本章实践例题本章实践例题[例4-15]定义父类SchoolMember,定义子类Teacher和Student,实现学校人员登记。本章实践例题[例4-16]定义类Triangle,实现能根据输入的三边,计算三角形的周长和面积。本章实践例题[例4-17]定义类Clock,实现数字时钟计时。小结本章结合实例介绍了Python中面向对象编程的基础内容,主要包括类的属性与方法的介绍以及相关应用实例的分析,帮助理解面向对象的编程思想。需重点掌握的内容有:类与对象的概念、Python中类的声明方法、类的属性与方法、类的封装、继承和多态等。小结本章习题1. 设计一个Car类,有类属性price,有一个实例属性color。请写出类的定义语句,并在主程序中写出生成该类的对象语句。主程序中还包括如下语句:Car.price=320000#修改类属性C='TSL'#增加类属性Car1.color="BLUE"#修改实例属性2. 设计一个水果类Fruit,有私有属性color,私有属性city,私有方法outputColor,私有方法outputCity,公有方法output(其中调用私有方法outputColor和outputCity),定义静态方法getPrice和setPrice。在主程序中定义Fruit类的对象,并尝试调用它的各个方法。3. 设计一个三维向量类Vecter3,并实现向量的加法(__add__)、减法以及向量与标量的乘法和除法运算。本章习题4. 定义矩形类rectangle,有实例属性breadth和length,并定义实例方法area,计算并返回矩形面积。5. 定义圆形类circle,有实例属性radius,并定义实例方法area和perimeter,计算并返回矩形面积。6. 定义父类person,有类属性name及age,有私有属性__height,有实例方法info,能输出person的name、age及__height信息。子类student类继承person,有类属性grade,有实例方法info,能输出学生的name、age及grade信息。本章习题第四章类与对象谢谢!Python数据分析与数据挖掘第5章NumPy基础与应用主讲人:***15-10月-23Python数据分析与数据挖掘目录contents数组基础0102数组的相关操作03数组读写数组基础015.1Numpy简介NumPy是Python的一个基础科学计算包,是许多高级的第三方科学计算的模块,如:Matplotlib、Pandas等,都是基于NumPy所构建的。它包含以下几个特点:强大的多维数组对象;精细而复杂的功能;用于集成C/C++和Fortran代码的工具;实用的线性代数,傅里叶变换和随机数功能。对于许多用户,尤其是Windows用户,学习Python的常用工具为Anaconda,其中包括所有数据分析的关键包,不需要再次安装,但可以在命令行中使用pip更新:

pipinstallnumpy–U

可以在/doc/stable/上查阅NumPy的使用文档。5.2NumPy数组基础数组是NumPy中的核心类型,全称为N维数组(N-dimensionalArray,ndarray),整个NumPy模块都是围绕数组来构建的,它是一个固定大小和形状的大数据集容器,该对象由两部分组成:(1) 实际的数据;(2) 描述这些数据的元数据;大部分的数组操作仅仅修改元数据的部分,而不改变底层的实际数据。

NumPy.array和标准的Python库中的Array.array是不一样的,标准的Python库中的Array.array只能处理一维数组,且所有元素的类型必须是一致的,支持的数据类型有整型、浮点型以及复数型,但这些类型不能够满足科学计算的需求,因此NumPy中添加了许多其他的数据类型,如bool、int、int64、float32、complex64等。

同时,NumPy数组有许多特有的属性。(见表5-1)5.2.1数组的属性属性说明.ndim秩,即轴的数量或维度的数量.shapendarray对象的尺度,对于矩阵,n行m列.sizendarray对象元素的个数,相当于.shape中n*m的值.dtypendarray对象的元素类型.itemsizendarray对象中每个元素的大小,以字节为单位.nbytesndarray对象中元素连续内存的大小表5-1NumPy数组常见属性列表5.2.1数组的属性-实例importnumpyasnparray=np.array([[1,2,3],[4,5,6]])#定义数组print(array.ndim)#查看数组的秩print(array.shape)#查看数组的形状print(array.size)#查看数组元素个数print(array.dtype)#查看数组元素类型print(array.itemsize)#查看元素所占字节print(array.nbytes)#数组所占内存大小运行结果:2(2,3)6int32424[例5-1]构建一个二维数组arr,并查看数组的属性特点。5.2.1数组的属性-实例[思考题]构建一个二维数组arr,请写出数组属性的输出结果。importnumpyasnp#定义数组array=arr=np.array([[iforiinrange(5)],[iforiinrange(5,10)]])print(array.ndim)#查看数组的秩print(array.shape)#查看数组的形状print(array.size)#查看数组元素个数print(array.dtype)#查看数组元素类型print(array.itemsize)#查看元素所占字节print(array.nbytes)#数组所占内存大小运行结果:2(2,5)10int324405.2.2创建数组在使用数组前,必须首先导入NumPy模块。导入格式:importnumpyasnp1、利用np.array()函数生成数组利用np.array()函数来创建,函数的参数可以是元组、列表,也可是另一个数组。语法格式为:X=np.array(list/tuple)或者X=np.array(list/tuple,dtype=np.dtype)注:当np.array()不指定dtype时,NumPy将根据数据情况自动匹配一个dtype类型。[例5-2]以列表创建:a=np.array([1,2,3,4]) d=np.array([[1,2,3],[4,5,6]])

[例5-3]以元组创建:b=np.array((1,2,3,4),dtype=np.float32)以列表+元组创建:c=np.array([[1,2],[3,4],(0.1,0.8)])注:若数值类型不同时,会将其合并为类型范围较大的一种5.2.2创建数组2、利用内置函数产生特定形式的数组函数说明np.arange(n)类似range()函数,返回ndarray类型,元素从0到n-1np.ones(shape)根据shape生成一个全1数组,shape是元组类型,默认浮点型np.zeros(shape)根据shape生成一个全0数组,shape是元组类型,默认浮点型np.full(shape,val)根据shape生成一个数组,每个元素值都是valnp.eye(n)创建一个正方的n*n单位矩阵,对角线为1,其他为0表5-2NumPy常见内置函数2、利用内置函数产生特定形式的数组1)

np.zeros()函数、np.ones()函数和np.eye()函数:

语法:X=np.xxx(shape,dtype=float)注:np.zeros()函数是生成一个数值全为零的数组,其中的行列数可以自定义。数值类型默认为浮点型。np.ones()函数用法与np.zeros()函数完全相同,只有数值不同。[例5-4]使用np.zeros()函数创建全0数组。5.2.2创建数组5.2.2创建数组2、利用内置函数产生特定形式的数组2)np.arange()函数

语法:X=np.arange([start,]stop[,step,],dtype=None)注:np.arange()函数可以产生一个等距数组,其中:[]内的内容可省略,start的默认值为0,step的默认值为1。故而,参数个数可以为1个、2个或3个。

当只含一个参数时,即只有stop参数,此时将生成一个从0到stop-1,步长为1的整数数组。【例5-5-Part1】当含2个参数时,即指定起始位置,生成一个从start到stop-1,步长为1的整数数组。【例5-5-Part2】当含3个参数时,即指定起始位置与步长,生成一个从start到stop-1,步长为定值的数组,指定的步长可以是浮点型。【例5-5-Part3】[例5-5]使用np.arange创建数组,分别带有1个参数、2个参数和3个参数。首先创建只带一个参数的,代码及输出结果如下:【例5-5-Part1】【例5-5-Part2】【例5-5-Part3】5.2.2创建数组2、利用内置函数产生特定形式的数组3)np.linspace()函数:

语法:np.linspace(start,stop,num=50,endpoint=True,retstep=False,dtype=None)注:Numpy中的linspace函数可以用来创建由等差数列构成的一维数组。相关的参数以及说明见下一张PPT表格。5.2.2创建数组2、利用内置函数产生特定形式的数组3)np.linspace()函数:表5-3linspace函数的参数及说明5.2.2创建数组[例5-6]使用linspace函数生成均匀分布的数组,代码及输出结果如下:2、利用内置函数产生特定形式的数组3)np.linspace()函数:5.2.2创建数组4)np.empty()函数:注:np.empty()函数是生成一个指定形状和类型且全为空的数组,该函数只是让系统分配指定大小的内容,而并没有初始化,里面的值是随机的。[例5-7]使用np.empty生成一个指定形状和类型且全为空的数组,代码及输出结果如下:2、利用内置函数产生特定形式的数组5.2.2创建数组3、生成随机数组1)

numpy.random.rand(d0,d1,...,dn)函数注:创建给定形状的数组,并使用[0.0,1.0)上均匀分布的随机浮点数填充该数组。当函数没有参数时,返回一个随机浮点数,当函数有一个参数时,返回该参数长度大小的一维随机浮点数数组,当函数有两个及以上参数时,则返回对应维度的数组。2)numpy.random.randint(low,high=None,size=None,dtype=int)函数注:返回随机整数数组,数据值位于半开区间[low,high)。可以用size设置数组的形状,例如,若size为(m,n,k),则绘制m*n*k形状的样本。size默认值为“None”,在这种情况下,将返回单个值。5.2.2创建数组3、生成随机数组3)numpy.random.randn(d0,d1,...,dn)函数注:返回一个或一组服从标准正态分布的随机样本值。当函数没有参数时,则返回一个浮点数,当函数有一个参数时,则返回秩为1的数组,不能表示向量和矩阵,当函数有两个及以上参数时,则返回对应维度的数组,能表示向量或矩阵。此外,np.random.standard_normal()函数与np.random.randn()类似,但是np.random.standard_normal()的输入参数为元组(tuple)。5.2.2创建数组3、生成随机数组4)

numpy.random.shuffle(x)函数注:类似洗牌操作,修改参数x。参数x为要洗牌的数组、列表或可变序列。5)numpy.random.permutation(x)函数注:随机排列一个序列,或返回一个排列的范围。如果x是一个多维数组,则它只会沿着其第一个索引移动。5.2.2创建数组3、生成随机数组[例5-8]使用random模块生成随机数组,代码及输出结果如下:5.2.3数组的数据类型数据类型说明bool布尔类型,true或falseintc与C语言中的int类型一致,一般是int32或int64intp用于索引的整数,int32或int64int8字节长度的整数,取值:[‐128,127]int1616位长度的整数,取值:[‐32768,32767]int32int64uint88位无符号整数,取值:[0,255]uint1616位无符号整数,取值:[0,65535]uint32uint64float1616位半精度浮点数:1位符号位,5位指数,10位尾数float3232位半精度浮点数:1位符号位,8位指数,23位尾数float6464位半精度浮点数:1位符号位,11位指数,52位尾数complex64复数类型,实部和虚部都是32位浮点数complex128复数类型,实部和虚部都是64位浮点数表5-4数组的数据类型5.2.3数组的数值类型[例5-9]创建整型和浮点型的混合类型数组,NumPy会将其统一改为浮点型。

当使用元组或列表时作为创建数组的参数时,若数据类型不同,会将其类型统一为类型范围较大的一种,即当传入的数据有多种类型时,NumPy会自动进行判断,将数组转化为最为通用的类型。5.2.4数组的迭代一维数组:迭代返回对应数组中的每一个元素。多维数组:迭代返回值是一个维度减一的数组。多维数组:可以进行列迭代和逐个元素迭代。行迭代[例5-10]一维和多维数组迭代。[例5-11]多维数组的列迭代和逐个元素迭代。列迭代逐个迭代5.2.5数组的索引和切片1、一维数组的索引

一维数组的索引与列表类似,不仅支持单个元素的索引,还支持负数索引与切片,负索引或切片后得到的结果仍是一个数组,可以进行数组的相关操作。[例5-12]一维数组索引。2、多维数组的索引---多重索引单个元素:array[行数][列数]某一行元素:array[行数]或array[行数,:]某一列元素:array[:,列数]某几行和某几列:[起始行:终止行,起始列:终止列][例5-13]多维数组索引。5.2.5数组的索引和切片1、合并 在水平方向上,一般采用hstack()函数实现两个数组的合并。 具体语法为:np.hstack((a,b))。 此外,concatenate(axis=1)函数和column_stack()函数可以实现类似的效果。[例5-14]数组水平方向上的合并。5.2.6数组的合并和拆分1、合并

在竖向方向上,一般采用vstack()函数实现两个数组的合并。

具体语法为:np.vstack((a,b))。

当参数axis设置为0时,concatenate()函数可以得到同样的结果。row_stack()函数亦如是。除此之外,还有一种是深向合并的操作,它是沿着第三个坐标轴的方向来合并,使用到的函数是dstack()。[例5-15]数组竖向及深向上的合并。5.2.6数组的合并和拆分2、拆分

水平拆分:对于一个n*m的数组,可以沿着水平方向将其拆分为m部分,并且各部分的大小和形状完全相同:hsplit()、split(axis=1)

竖向拆分:对于一个n*m的数组,也可以沿着竖向(按行)将其拆分为n部分,并且各部分的大小和形状完全相同:vsplit()、split(axis=0)

深向拆分:对于一个n*m的数组,也可以沿着深向将其拆分为n部分:dsplit()5.2.6数组的合并和拆分[例5-16]数组的拆分。5.2.6数组的合并和拆分数组的相关操作025.3.1统计相关操作NumPy提供了很多统计函数,可以支持对数组的多种统计操作。例如,从数组中查找最小元素,最大元素,计算均值、标准差和方差等。

常见的统计函数及说明见表5-5。函数说明.sum()数组求和,默认对所有元素求和.prod()数组求积,默认对所有元素求积.max()和.min()求数组元素中的最大值或者最小值.argmax()和.argmin()求数组元素中的最大值或者最小值的位置.mean()求数组所有元素的均值.std()和.var()求数组元素中的标准差或方差表5-5数组的统计操作[例5-17]数组统计相关操作实例。5.3.1统计相关操作1、修改数组形状:.shape属性[例5-18]使用.shape属性修改数组形状。5.3.2形状相关操作5.3.2形状相关操作2、不改变数组自身形状的方法:reshape()方法 reshape()方法也可以实现类似.shape属性的效果,但是它不改变原数组的形状,并返回一个新的数组。注意:形状参数必须与数组大小一致,否之会抛出异常。 reshape()方法可以接受一个“-1”作为参数,当某一维度是-1时,NumPy会自动根据其他维度来计算这一维度的大小。[例5-19]使用.reshape()方法不改变原数组形状。[例5-20]使用“-1”作为.reshape()参数。3、改变数组自身形状的方法:.resize()方法.resize()方法的作用与reshape()方法的功能一致,但改变原来数组的形状。它的原理是首先将原来数组转变为一维数组,再判断元素的个数,若缺失,则缺失元素以0补全;若过满,则只截取所需元素,从而实现对数组形状的修改。注意:.resize()方法不支持-1参数。[例5-21]使用.resize()方法改变数组自身形状。5.3.2形状相关操作4、数组的转置:.T属性和.transpose()方法对于数组而言,转置可以通过.T属性和.transpose()方法实现。一般情况下,这两种方法是等价的。对一维数组而言,转置返回它的本身;对于二维数组而言,转置相当于将其行列互换;对于多维数组而言,转置是将所有的维度反向,原来的第一维变为最后一维,原来的最后一维变成第一维。[例5-22]数组的转置。5.3.2形状相关操作5、数组的降维:.flat属性、.flatten()方法和.revel()方法数组的降维是针对多维数组而言的,可以利用.flat属性得到数组中的一个一维引用数组,同时,此属性支持修改对应数值,从而使原数组的对应位置有相应的改变。.flatten()方法和.revel()方法也可以实现将数组返回一维化的结果,但是.flatten()方法返回的是原数组的一个复制,修改它对原数组不产生影响。.revel()方法是返回引用,只有在必要时返回复制。[例5-23]数组的降维。5.3.2形状相关操作5.3.3四则运算&点乘&比较操作[例5-24]数组的四则运算、点乘与比较操作。数组与数字之间的四则运算,规则是数组元素分别对应进行相应运算。[例5-24]数组的四则运算、点乘与比较操作。数组与数组之间也可以进行四则运算,前提是参与运算的数组需有相同的行列。运算规则是按位运算,对应位置进行运算。此外,数组还支持幂运算、取余和取整运算。5.3.3四则运算&点乘&比较操作[例5-24]数组的四则运算、点乘与比较操作。在数学上,二维数组可以看成矩阵,一维数组可以看成向量,它们还支持点乘运算,用.dot()函数实现。5.3.3四则运算&点乘&比较操作[例5-24]数组的四则运算、点乘与比较操作。数组还支持其他运算,例如,比较和逻辑操作。在比较操作中,数组可以与一个数进行比较,会返回一个布尔型的数组;数组与数组之间也可以进行比较,返回一个布尔型数组。5.3.3四则运算&点乘&比较操作数组读写035.4.1数组的读取

从文本文件中读取数据:np.loadtxt()函数。语法格式为:numpy.loadtxt(fname,dtype=<class'float'>,comments='#',delimiter=None,converters=None,skiprows=0,usecols=None,unpack=False,ndmin=0,encoding='bytes',max_rows=None,*,like=None)

说明如表5-6。[例5-25]从文本文件中读取数据,读出的数据为数组类型。首先读取dat

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论