Python程序设计基础 课件 第九章 数据分析与可视化_第1页
Python程序设计基础 课件 第九章 数据分析与可视化_第2页
Python程序设计基础 课件 第九章 数据分析与可视化_第3页
Python程序设计基础 课件 第九章 数据分析与可视化_第4页
Python程序设计基础 课件 第九章 数据分析与可视化_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

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

文档简介

第九章数据分析与可视化本章重点介绍三个程序包numpy、pandas和matpoltlib的用法。这三个程序包均为Python语言的外部扩展包,使用它们前需要安装这些包。在PyCharm中,单击菜单“文件|设置|项目:MyPythonPrj|Python解释器”,这里的“MyPythonPrj”为本书所使用的Python工程名。然后,单击显示的页面的左上方的“+”号安装这三个程序包的最新版本。当前,numpy的版本为1.23.1;pandas的版本为1.4.3;matplotlib的版本为3.5.2。第九章数据分析与可视化程序包numpy实现了一种新的数据类型——数组,与C语言意义上的数组概念相同,即包含相同类型元素的一组数据(事实上,这种数据类型类似于Python语言内置的“列表”,可以存储不同类型的数据,例如,同时存储整数和字符串,但是numpy提供的函数主要是针对同类型数据),同时,numpy基于数组提供了大量的函数,包括数学函数、统计函数、伪随机数函数和字符串函数等,使得numpy应用广泛。此外,numpy的处理速度快,并且是pandas等外部程序包的基础。程序包pandas实现了两种新的数据类型,即Series(序列)和DataFrame(数据框架),这两种数据类型的优势在于可以处理数组中的缺失值。pandas提供了基于Series和DataFrame数据对象的大量统计函数。pandas包主要针对数据统计和大数据处理等应用。程序包matplotlib是一个二维绘图库,可以绘制各种数学函数图形和金融数据图形,是Python语言中数据可视化的重要工具,其特点在于绘图函数简单易用,借用了MATLAB软件中的绘图函数的名称,生成的图形可以用于科技论文中。第九章数据分析与可视化本章将分为三节内容来介绍程序包numpy、pandas和matpoltlib的用法:第九章数据分析与可视化9.1程序包numpy9.1.1数组创建9.1.2数组元素访问9.1.3矩阵运算9.1.4常用方法9.2程序包pandas9.2.1Series对象定义9.2.2Series对象访问9.2.3Series对象计算9.2.4DataFrame对象定义9.2.3DataFrame对象访问9.2.4DataFrame对象数据处理9.3程序包matpoltlib9.3.1绘图基本方法9.3.2散点图9.3.3柱状图程序包numpy的算法基于其自定义的数据类型——数组,一般地,认为数组具有相同类型的元素。元素类型可以为字符串和各种数据类型,例如,importnumpyasnp#装载包numpy,并赋以别名nparr1=np.array([1,2,3],dtype='int_')print(arr1)print(arr1.dtype)将创建一个数组arr1,其元素为“1,2,3”,“dtype”用于指定数组元素的类型,这里的“int_”为默认的整型,因计算机而异,可能为32位整型int32,或64位整型int64。“print(arr1)”输出数组arr1,得到“[1,2,3]”;“print(arr1.dtype)”输出数组(元素)的类型。9.1程序包numpy一般地,使用默认的元素数据类型创建数组时不需要指定“dtype”。默认的元素数据类型有“int_”、“float_”、“complex_”,分别表示32位或64位有符号整型、64位浮点型(IEEE754格式,其中,1个符号位、11个指数位、52个尾数位)和128位复数型(其中,实部和虚部各占64位)。其他的常用数值型数据类型包括8位有符号整型(int8)、8位无符号整型(uint8)、16位有符号整型(int16)、16位无符号整型(uint16)、32位有符号整型(int32)、32位无符号整型(uint32)、64位有符号整型(int64)、64位无符号整型(uint64)、单精度浮点数(float32)、双精度浮点数(float64)、复数complex128(实部和虚部分别为64位双精度浮点数)等。9.1程序包numpy一般地,认为程序包numpy的所有方法均基于其自定义数据类型——数组,所以,使用包numpy的方法前,必须定义数组。创建数组的方法有以下四种:(1)将列表转化为数组包numpy的array方法可以将列表转化为数组。对于一维列表,将被转化一维数组;对于二维的嵌套列表,要求列表中每个子列表的元素个数必须相同,这样的嵌套列表被转化为二维数组;对于高维的嵌套列表,同样要求同级别的子列表的元素个数相同,这样的高维嵌套列表被转化为高维数组。(2)使用程序包numpy的内置方法生成特殊数组程序包numpy具有生成特殊数组的内置方法,这些方法包括zeros、zeros_like、ones、ones_like、empty等。其中,zeros方法可以生成元素全为0的数组,zeros生成二维以上的数组时,使用元组作为参数,例如:zeros((3,4))生成3行4列的数组,元素均为0。zeros_like方法的参数为一个数组,将生成与该数组相同结构的数组,其元素均为0。ones和ones_like方法分别与zeros和zeros_like方法相似,只是生成的数组元素均为1。empty方法生成一个数组,主要是为新生成的数组开辟存储空间(其元素值不定),为后续使用该数组的方法服务。9.1.1数组创建(3)使用程序包numpy的内置方法生成规则数组生成规则数组的方法主要有arrange和linspace。其中,arrange方法的语法为:arrange(起始值,终止值(不含),步长)。例如,arrange(1,3,0.5)将得到“[1.01.52.02.5]”。linspace方法的语法为:linspace(起始值,终止值(含),分隔点数)。例如,linspace(1,3,5)得到“[1.01.52.02.53.0]”。可见,arrange和linspace均用于生成等差数列形式的数组。(4)使用程序包numpy的内置类random生成伪随机形式的数组 程序包numpy的内置类具有rand、randn和uniform等方法,可以生成伪随机数组。其中,rand用于生成[0,1)上均匀分布的伪随机数组,例如,rand(3,2)生成一个3行2列的[0,1)上均匀分布的伪随机数组。randn生成均值为0、方差为1的伪随机数组,例如,randn(3,2)生成一个3行2列的正态分布的伪随机数组。uniform(左边界,右边界,数组大小)用于生成[左边界,右边界)上的均匀分布的数组,数组大小由参数“数组大小”决定。例如,uniform(1,10,5)生成长度为5的[1,10)上均匀分布的伪随机数组;uniform(1,10,(3,2))生成3行2列的数组,每个数组元素服从[1,10)上的均匀分布。9.1.1数组创建下面的实例介绍了上述创建数组的方法:(第一部分)9.1.1数组创建第1行装载numpy程序包,并赋以别名np。第3行将列表“[1,2,3,4,5]”转化为一维数组,赋给arr1。第4行将嵌套列表“[[1,2,4],[4,5,6]]”转化为2行3列的二维数组,赋给arr2。第5、6行依次输出数组arr1和arr2。第7行调用ones方法生成长度为5的数组,其元素均为1。第8行生成3行4列的数组,其元素均为1。第9、10行依次输出数组arr3和arr4。第11行生成与arr2同样大小的数组,其元素均为0。第12行生成与arr2同样大小的数组,其元素均为1。第13、14行依次输出数组arr5和arr6。(第二部分)9.1.1数组创建第15行调用arange方法生成等差数列形式的数组arr7,首元素为1,步长为0.5,直到3(不含)。第16行调用linspace方法生成1至3间等差排列的长度为5个元素的数组arr8。第17、18行依次输出arr7和arr8。第19行设置伪随机数发生器的“种子”为299792458,这里为伪随机数发生器设置一个种子值的原因在于,使第20~22行的伪随机数函数生成的伪随机数序列相同。如果不给伪随机数发生器设置“种子”,伪随机数发生器将使用计算机的“时钟计数值”作为种子,从而第20~22行的伪随机数函数在每次执行时都将得到不同的值。第23行恢复使用“时钟计数值”作为伪随机数发生器的“种子”。第20行生成[0,1)上均匀分布的3行2列的数组arr9。第21行生成长度为4的服从标准正态分布的伪随机数组arr10。第22行生成长度为5的服从1至10(不含)间均匀分布的伪随机数组arr11。第24~26行依次输出数组arr9、arr10和arr11。数组元素的访问与“列表”元素的访问方法相同。对于一个一维数组arr1,其元素索引号从左向右为0至“元素总个数减1”;从右向左为-1至“元素总个数的相反数”。访问arr1中元素的方法主要有两种:其一,arr1[n]访问数组arr1中索引号为n的元素;其二,arr1[m:n:k]访问数组arr1中索引号自m至n(不含)步长为k的元素,省略k时表示默认步长为1,省略m时表示起始索引号为0,省略n时表示n取为数组的最后一个元素的索引号加1的值。arr1.shape将返回一个元组,类似于“(7,)”,这里的“7”表示arr1的元素个数。arr1.size返回一个数,表示arr1的元素总个数。arr1.ndim返回数值1,表示arr1为一维数组。9.1.2数组元素访问对于一个二维数组arr2,其行索引号从0至“总行数减1”(或从“总行数的相反数”至-1),其列索引号从0至“总列数减1”(或从“总列数的相反数”至-1)。访问arr2中元素的方法为:其一,arr2[m1,m2]访问数组arr2中行索引号为m1、列索引号为m2的元素;其二,arr2[m1:n1:k1,m2:n2:k2]访问数组arr2中行索引号为m1至n1(不含)步长为k1、列索引号为m2至n2(不含)步长为k2的全部元素,步长k1或k2省略时使用缺省值1;起始值m1或m2省略时使用索引号0;终止值n1或n2省略时使用行或列的最大索引号加上1的值。arr2.shape返回一个元组,包括arr2的行数和列数;arr2.ndim返回值2,表示arr2为一个二维数组;arr2.size返回一个数,表示arr2中总的元素个数。9.1.2数组元素访问下面的实例展示了数组元数访问方法:第1行装载程序包numpy,并赋以别外np。第3行创建2行3列的数组arr1。第4行“创建3行2列的数组arr2。第5行创建2行5列的数组arr3。第6行在屏幕上打印数组arr1。第7行“输出arr1的形状、大小和维数。第8行输出数组arr2的全部元素;第9行输出数组arr3的全部元素。第10行输出arr1的第0行第0列的元素以及第1行最后一列的元素。第11行输出arr2的第1行的全部元素以及第0列的全部元素。第12行输出arr3的第0行第0列依步长2至最后一列(不含)的元素以及第1行第2行至最后一列(不含)的元素。第13行赋arr3的第0行第0列的元素为21。第14行输出arr3的全部元素,此时,其第0行第0列的元素为21。第15行将数组arr3的第0行赋为列表“[11,12,13,14,15]”。第16行输出arr3的全部元素,此时,其第0行的元素为“[1112131415]”。注意,数组元素间以空格为分界符。第17行创建一维数组arr4。第18行输出数组arr4。第19行输出数组arr4的形状、大小和维数,这里,arr4的形状为“(7,)”,大小为7,维数为1。9.1.2数组元素访问一般地,二维规则数组称为矩阵,即矩阵的每一行具有相同个数的元素。常用的矩阵运算有:(1)单个数值与矩阵的和。此时,将单个数值加到矩阵的每个元素中。(2)单个数值与矩阵的积,称为数乘。此时,将单个数值乘以矩阵的每个元素。(3)两个矩阵的和。要求参与相加运算的两个矩阵具有相同的行、列数。此时,两个矩阵对应位置上的元素取和。(4)两个矩阵的数量积。要求参与相乘运算的两个矩阵具有相同的行、列数。此时,两个矩阵对应位置上的元素相乘。(5)两个矩阵的矩阵积。要求参与相乘运算的前一个矩阵的列数等于后一个矩阵的行数,此时,前一个矩阵的第i行的元素与后一个矩阵的第j列的元素的乘积取和,作为结果矩阵的第i行第j列的元素。(6)矩阵求逆。求一个矩阵的逆矩阵,使之与原矩阵的矩阵积为单位矩阵。9.1.3矩阵运算下面的实例展示了上述矩阵运算:第3行调用reshape方法将一维数组转化为2行3列的矩阵arr1。第4行输出矩阵arr1。第5行调用reshape方法将一维数组转化为3行2列的矩阵arr2。第6行输出矩阵arr2。第7行将数值15与矩阵arr1相加,即将15与矩阵arr1的每个元素相加,结果赋给arr3。第8行输出矩阵arr3。第9行将矩阵arr1的每个元素乘以2,赋给arr4。第10行输出矩阵arr4。第11行将矩阵arr1与arr3相加,得到的矩阵赋给arr5。第12行输出矩阵arr5。第13行计算矩阵arr1与arr3的数量积,结果赋给arr6。第14行在屏幕上打印arr6。第15行调用dot函数计算arr1和arr2的矩阵积,结果赋给arr7。第16行在屏幕上输出arr7。第17行调用线性代数模块linalg中的inv方法计算arr7的逆矩阵,结果赋给arr8。第18行输出arr8。9.1.3矩阵运算程序包numpy常用的数值计算方法如下表所示。在表中,np表示numpy的别名;设矩阵a为“[[1234][5678][9101112]]”,即矩阵a由语句“a=np.arange(1,12+1).reshape(3,4)”得到;设矩阵b为“[[1.12.23.3][4.45.56.6]]”,即矩阵b由语句“b=np.array([[1.1,2.2,3.3],[4.4,5.5,6.6]])”得到;设矩阵d为“d=np.array([[7,1,6,9],[11,19,8,2]])”。9.1.4常用方法9.1.4常用方法下面的实例进一步介绍了表中部分方法的用法:9.1.4常用方法第3行设置伪随机数发生器的“种子”为299792458。第4行生成一个4行5列的伪随机矩阵,其元素服务标准正态分布。第5行恢复“时钟计数值”作为伪随机数发生器的“种子”。第6行输出矩阵a1。第7行得到一个逻辑矩阵a2,对应于a1中正的元素,a2中的元素为True;对于a1中非正的元素,a2中的元素为False。第8行输出矩阵a2。第9行统计a1中为正数的元素的总个数。第10行输出a3的值。第11行统计a1中每行元素中为正数的个数,赋给a4。第12行输出a4。第13行调用where方法将a1中大于1的元素设为1,结果赋给a5。第14行调用where方法将a5中小于1的元素设为-1,结果赋给a6。第15行计算a6中每个元素的反正弦值,然后,转化为度,赋给a7。第16行输出a7。第17行统计a1中每行元素的平均值,赋给a8。第18行输出a8。程序包pandas主要用于大数据统计分析,基于其自定义的两种数据类型Series和DataFrame。其中,Series是带有索引号的序列,数据处理可以自动识别索引号;DataFrame为带有行索引和列索引的二维数据表格,DataFrame数据对象可以视为Series数据对象组成的“字典”,其“键”为列索引,其“值”为Series数据对象。9.2程序包pandasSeries对象的定义语法为:Series(数值列表,index=索引列表,name=字符串表示的Series对象名称)。下面的实例展示了Series对象的常用创建方法:9.2.1Series对象定义第1行“importnumpyasnp”装载程序包numpy,并赋以别名np。第2行“importpandasaspd”装载程序包pandas,并赋以别名pd。创建数组arr1,使用arr1创建Series对象ser1,并输出ser1对象。创建数组arr2,为[1011121314151617],将数组arr1作为ser2对象的值,将数组arr2作为ser2对象的索引号,ser2对象的名称设为“Ser2”,并输出ser2对象,将列表[8,9,9,1,10,2]作为ser3对象的值,将列表['a','b','c','d','e','f']作为ser3对象的索引号,输出对象ser3。尽管Series对象的索引号可以使用字符串等数据类型,但是索引号的作用于在检索(或查找)Series对象中的数据,建议尽可能使用整型索引号。访问Series对象的元素需要通过其索引号访问,访问结果为一个数值或一个新的Series对象。下面将在上一个实例的基础上介绍Series对象的访问方法:9.2.2Series对象访问第12行输出ser1对象中索引号为3的元素的值,这里得到“ser1[3]=4”。第13行提取出ser1对象中索引号为3的元素,构造一个新的Series对象。第14行表明Series对象支持多个元素同时访问。第15行输出ser3的索引号为1的元素的值。第16行输出一个Series对象,包含了ser3对象的索引号为['a','d','b']的元素。第17行输出ser3的索引号对象。第18行该行语句返回一个数组,包含了全部索引号。第19行以数组的形式输出ser2对象的值。第20行将ser3对象的索引号为0的元素的值设为32。第21行将ser3对象的索引号为[2,3,4]的元素的值设为[17,18,19]。第22行输出ser3对象,可见其索引号为0、2、3、4的元素的值变为32、17、18、19。Series对象支持numpy对象的数值运算方法,例如:v1=np.sin(ser1),这里ser1为一个Series对象,np为numpy的别名,该语句将对ser1对象的每个元素的值取正弦值(索引号不变)。此外,Series对象之间的算术运算自动根据索引号对齐,下面的实例借助于加法运算展示了这种情况:9.2.3Series对象计算第4行和第5行创建两个数组arr1和arr2,其元素类型为64位整型。第6行由数组arr1创建Series对象ser1,其索引号为[1,2,3,4,5,6]。第7行由数组arr2创建Series对象ser2,其索引号为[3,4,5,6,7,8]。第8、9行依次输出ser1和ser2。第10行将ser1与ser2相加,赋给ser3。相加的规则为:将ser1和ser2中索引号相同的元素值相加,该索引号作为相加后的元素值的索引号;ser1或ser2中独有的索引号对应的元素,在ser3中变为“NaN”(非数值)。第11行输出ser3。第12行剔除ser3中值为NaN的元素,这里,pd.notnull(ser3)返回一个Series对象,其值为True或False,对应于ser3对象为NaN的元素其值为False,对应于ser3对象不为NaN的元素其值为True。ser3[pd.notnull(ser3)]根据pd.notnull(ser3)对象的逻辑值“过滤”ser3中的元素,将逻辑值为False的元素剔除掉,仅保留那些逻辑值为True的元素。第13行输出ser4对象的值。DataFrame数据类型是pandas程序包定义的表示二维数据的数据结构,具有列索引和行索引,可借助于字典、数组或Series对象构造DataFrame对象。DataFrame对象的构造方法DataFrame常用的参数有:(1)data,为第一个参数,表示创建DataFrame对象的数据源;(2)index,表示行索引;(3)columns,表示列索引。9.2.4DataFrame对象定义展示了DataFrame对象的创建方法:9.2.4DataFrame对象定义第4~5行展示了使用字典创建DataFrame对象的方法。第4行定义字典fr1。第5行调用DataFrame方法将字典fr1转化为DataFrame对象。第6行输出fruit对象。第7~8行展示了使用数组创建DataFrame对象的方法。第7行创建4行2列的二维数组fr2。第8行使用fr2创建DataFrame对象fruit2,行索引号为“['a','b','c','d']”,列索引号为“['name','price']”。第9行输出fruit2对象。第10~13行展示了使用Series对象创建DataFrame对象的方法。第10行创建Series对象fr31;第11行创建Series对象fr32。第12行按行将fr31和fr32合并成一个DataFrame对象。这里对象fr31和fr32具有相同的索引号。第13行为fruit3对象指定列索引号。第14行输出fruit3对象。DataFrame对象可视为一个二维表格,其每个“单元格”可以单独访问,也可整行或整列访问。下面的实例在上一个实例的基础上,添加了DataFrame对象的访问方法。9.2.5DataFrame对象访问读取DataFrame对象的一列数据,第15行使用“”访问fruit1对象的name索引号对应的整列数据。此外,也可以使用第16行的方法即“fruit2['name']”访问fruit2对象的name索引号对应的整列数据,返回的数据为Series对象。读取DataFrame对象的一个“单元格”数据,第17行使用“fruit2['name'][1]”读取fruit2对象的第name列第1行的数据,返回单个数据(这里是一个字符串)。读取DataFrame对象的部分行和部分列交叉的数据,第18行使用“fruit3[['name','price']][1:2+1]}”读取fruit3对象的第name和price列与第1和2行交叉的数据,返回一个DataFrame对象。读取DataFrame对象的一行数据,第19行使用loc属性读取fruit2对象的第b行数据,返回一个Series对象。也可以使用iloc方法读取一行数据,iloc方法的参数为整数类型的索引号(如果索引号为字符串,则使用其对应的默认索引号)。第20行使用“fruit2.iloc[2]”读取fruit2对象的第2行数据,返回结果为一个Series对象。向DataFrame对象的一个“单元格”写入数据,如第21行所示。第21行向fruit3对象的第2行第name列写入值“Strawberry”。这里的at属性用于定位DataFrame对象的单元格,iat属性类似于at属性,但iat属性使用整型数值作为行列的索引号。向DataFrame对象写入一行数据,如第22行所示。第22行向fruit3的第1行写入数据“['Pineapple',7.8]”。向DataFrame对象写入一列数据,如第23行所示。第23行向fruit3对象的第price列写入一列数据“[5.5,7.8,4.5,6.5]”。第24行输出新的fruit3对象。DataFrame对象的每一列或每一行均可视为Series对象,所以,Series对象的方法均可以应用于DataFrame对象的列数据或行数据上。此外,DataFrame对象具有一个apply方法,该方法可将一个lambda函数应用于DataFrame对象的一列数据或一列数据上。9.2.6DataFrame对象访问下面的实例介绍了DataFrame对象上的常用数据处理方法:第3~6行创建一个DataFrame对象fruit1。第7行输出fruit对象。第8行使用max方法求fruit对象第price列中的最大值。第9行调用apply方法将lambda函数应用于fruit1对象的列数据中,结果赋给fruit2。这里“axis=0”表示对每一列数据进行操作,“lambdax:x*2ifisinstance(x[0],float)elsex”中x代表fruit1的一列数据,x[0]表示该列数据中的首元素,这里lambda函数表示如果fruit1对象的某列数据的首元素为浮点数,则该列数据均乘以2。第10行输出fruit2对象。第11行调用sort_index方法对fruit2的索引排序,排序后的结果赋给对象fruit3,其中参数“ascending=False”表示按降序排列。第12行输出fruit3对象。第13行调用sort_values方法对fruit2对象的第price列按降序排列,排序后的结果赋给fruit4对象。第14行“输出对象fruit4。9.2.6DataFrame对象访问绘制时间序列的曲线图形需使用plot函数,plot函数的语法为:“plot(x轴数据,y轴数据,控制线型的字符串,可选的关键字参数)”,其中,“控制线型的字符串”用于设置线条的颜色、线型等,例如,“r--”表示红色虚线条。“可选的关键字参数”用于设置线条的其他属性,例如,“linewidth=1”表示线宽为1个单位,“color='red'”表示颜色为红色。9.3.1绘图基本方法下面的实例通过plot函数介绍Python语言绘图的基本方法:绘制典线图的步骤有五步:(1)生成x轴和y轴上的数据。这里第4行生成一个数组t,作为x轴上的数据。第5行和第6行生成的数组x1和x2均作为y轴上的数据。(2)设定一个画布。第7行定义编号为1的画布,大小为6×4。如果省略第7行,将使用默认的画布。(3)在当前画布上绘制曲线。第8行绘制x1~t曲线;第9行绘制x2~t曲线。第10行将当前画布的图形保存为图形文件zy1.png。第11~13行定义编号为2的画布,并在基上绘制曲线,指定线型为虚线。(4)为图形添加横纵坐标标签和图例等,如第14~20所示。第14~16行设定横坐标标签为“t”;第17~19行设定纵坐标标签为“x”。第20行设定图例为“sin(t)”和“cos(t)”,并将图例放置在画布右上角位置。(5)调用show方法显示画布和图形。9.3.1绘图基本方法将离散时间序列中的数据点绘制在二维图形中,得到的图形称为散点图,散点图中各个点间不用线段连接。绘制散点图的方法有两种:其一,使用plot函数,设置线条宽度为0;其二,使用scatter函数。下面的实例介绍了散点图的绘制方法:第4行生成一个数组t,具有20个数值,这些数值构成区间0至2上的20个等分点(含2个端点)。第5行生成数组x1,x1的各个元素为数组t的各个元素的正弦值。第6行计算数组t的各个元素的余弦值,得到一个新的数组x2。第7行数组x1与x2相加,得到一个新的数组x3。第8行数组x1减去x2得到一个新的数组x4。第9行创建编号为1的画布。第10~15行在编号为1的画布上绘制图形。第10行绘制

温馨提示

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

评论

0/150

提交评论