循序渐进Python程序设计 课件 第9章Numpy库的使用_第1页
循序渐进Python程序设计 课件 第9章Numpy库的使用_第2页
循序渐进Python程序设计 课件 第9章Numpy库的使用_第3页
循序渐进Python程序设计 课件 第9章Numpy库的使用_第4页
循序渐进Python程序设计 课件 第9章Numpy库的使用_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

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

文档简介

01020304第9章NumPy库的使用9.1NumPy数组应用基础9.2数组的运算9.3数据统计与分析9.4Numpy与线性代数059.5综合应用案例9.1NumPy数组应用基础9.1.1数组的基本概念9.1.2创建数组9.1.3数组的基本操作第9章NumPy库的使用9.1.1数组的基本概念NumPy(NumericalPython)是Python科学计算的核心库,NumPy库最核心的数据类型是多维数组对象(ndarray),它是一个固定大小的、元素具有相同数据类型的数组。由于NumPy数组主要用于科学计算。9.1NumPy数组应用基础(1)一维数组(也称为向量),是最简单的NumPy数组类型,可以视为有序的数值列表。其元素具有相同的数据类型,在内存中是连续存储的。如:一维数组[1489]。(2)多维数组是一维数组的扩展。最常见的多维数组是二维数组(也称为矩阵),可以视为由多个一维数组组成的列表。更高维度的数组则可视为由多个低维数组组成的嵌套结构。如:二维数组[[1,2,3,4],[5,6,7,8]]1.数组的定义2.数组的维度数组的维度(也称为轴,axis)描述了数组的结构和组织方式,反映了数组在不同层次上的排列情况。三维数组[[[2,2,3,4],[5,6,7,8]],[[1,2,3,4],[5,6,7,8]]]的层次结构示意图。图9.1三维数组层次结构示意图第9章NumPy库的使用9.1.1数组的基本概念9.1NumPy数组应用基础3.数组的五个属性数组的五个属性(5)itemsize(数组元素的字节数)(1)ndim(数组的维度)(2)shape(数组的形状)(4)size(数组元素总数)(3)dtype(元素的数据类型)例如:[[1,2,3],[4,5,6]]的ndim是2,shape为(2,3),dtype为int64,size为6,itemsize为8【练一练9.1】确定数组[[[1,2],[3,4],[5.6]],[[7,8],[9,10],[11,12]]]的ndim、shpae、dtype、size和itemsize属性的值。第9章NumPy库的使用9.1.2创建数组9.1NumPy数组应用基础1.从Python列表或元组创建数组语法格式:array(object,dtype=None)object为元组或列表,也可以是数组。dtype指定数据类型。常用数据类型有:bool8、byte、int8、int16、int32、int64、uint、uint8、uint16、uint32、uint64、float16、float32、float64,也可指定为int或float类型。importnumpyasnpar1=np.array([10,20,30,40,50,60,70,80])print(ar1)#输出结果:[1020304050607080]ar2=np.array([[10,20,30,40],[50,60,70,80]])print(ar2)#输出结果:[[10203040][50607080]]【例9.1】利用列表创建数组print(ar1.itemsize)#输出结果:8ar1=np.array([10,20,30,40,50,60,70,80])ar1=np.array([10,20,30,40,50,60,70,80],dtype='int32')print(ar1.itemsize)#输出结果:8第9章NumPy库的使用9.1.2创建数组9.1NumPy数组应用基础2.创建特殊数组zeros_like函数语法格式:zeros_like(ndarray)shape为必选参数,指定输出数组的形状,可以是一个整数或整数元组。例如shape=(3)将创建一个长度为3的一维数组,shape=(2,3)将创建一个2行3列的二维数组。dtype指定数据类型。用于指定数组中元素的数据类型。如果未指定,默认为float64。order用于指定数组在内存中的存储顺序,默认为'C',按行存储,如果是'F',则按列存储。大多数情况下,不需要修改此参数。(1)使用zeros函数或zeros_like函数创建全0数组zeros函数语法格式:zeros(shape,dtype=None,order='C')使用zeros_like(ndarray)函数非常简单,只需要一个输入数组作为参数,即可返回一个新的全0数组,该数组的形状和类型与输入数组相同。【练一练9.2】创建一个2行3列的零矩阵。第9章NumPy库的使用9.1.2创建数组9.1NumPy数组应用基础2.创建特殊数组ones_like函数语法格式:ones_like(ndarray)该函数的使用方法与zeros或zeros_like函数类似,只不过其数组元素为全1。(3)使用eye函数创建单位矩阵ones函数语法格式:ones(shape,dtype=None,order='C')importnumpyasnp#数组ar1是形状为(2,5)的矩阵ar1=np.array([[1,3,5,7,9],[2,4,6,8,10]])#ar2是形状为(2,5)的全1矩阵ar2=np.ones_like(ar1)print(ar2)【例9.2】创建一个和ar1形状一样的全1矩阵(2)使用ones函数或ones_like函数创建全1数组eye函数语法格式:eye(N,M,k=0,dtype=None,order=’C’)参数说明:N为必需参数,指定矩阵的行数。M为可选参数,指定矩阵的列数,默认值为None,表示矩阵的列数为N,即矩阵是N×N的方阵。k为可选参数,指定主对角线的偏移量(k=0表示主对角线;k>0表示向上偏移;k<0表示向下偏移)。dtype为可选参数,指定矩阵元素的数据类型。order为可选参数,指定数组在内存中的存储顺序,可设置为'C'或'F',默认值为'C',按行存储。importnumpyasnp ar1=np.eye(3) #3阶单位矩阵ar2=np.eye(3,4)#主对角线上的元素全为1,其他元素全为0的3行4列矩阵【例9.3】

第9章NumPy库的使用9.1.2创建数组9.1NumPy数组应用基础2.创建特殊数组各参数的作用参阅zeros函数。数组中的元素未初始化,即元素的值是内存中的现有值,具体值无法确定。需要在后续处理中对数组元素赋值。empty函数语法格式:empty(shape,dtype=None,order='C')(5)使用full函数和full_like函数创建指定形状且元素全为指定值的数组(4)使用empty函数创建未初始化数组参数说明:shape指定数组的形状。可以是整数或元组。fill_value指定用于填充数组元素的数据,可以是整数、浮点数、布尔值等。full函数语法格式:full(shape,fill_value,dtype=None,order='C')如full(4,10)可创建一个包含4个元素,且元素全为10的一维数组。full_like函数语法格式:full_like(ndarray,fill_value)参数说明:ndarray为输入数组,fill_value指定用于填充数组元素的数据。创建一个和ndarray形状相同,填充值为fill_value的数组。第9章NumPy库的使用9.1.2创建数组9.1NumPy数组应用基础3.根据给定的数值范围创建数组Start:表示数列的起始值。参数默认值为0End:表示数列的结束值(不包含该值)。Step:表示数列的步长,参数默认值为1。dtype:表示数据类型,缺省dtype,数列的数据类型取决于start、end和step的数据类型,系统自动检查,用户可以根据自己的实际需求选择是否使用。arange函数语法格式:arange(start=0,end,step=1,dtype=None)(1)使用arange函数根据等差数列创建数组arange函数有三种调用方式:arange(end):以首项为0、公差为1、终止项为end-1的等差数列创建数组。arange(start,end):以首项为start、公差为1、终止项为end-1的等差数列创建数组。arange(start,end,step):以首项为start、公差为step、终止项为小于end的等差数列。【例9.4】importnumpyasnpar1=np.arange(10)print(ar1) #输出:[0123456789]ar2=np.arange(10,21,2)print(ar2) #输出:[101214161820]ar3=np.arange(1.1,10,2.3)print(ar3) #输出:[1.13.45.78.]第9章NumPy库的使用9.1.2创建数组9.1NumPy数组应用基础3.根据给定的数值范围创建数组start:等差数列首项。end

:等差数列结束项。num:生成的数据元素的个数(必须是非负整数),默认为50。endpoint:设置数组中是否包含end的值(默认为True,包含)。Retstep:设置是否返回等差数列的公差,默认为False。如果为True,则返回元组(samples,step),其中samples是生成的数组,step是等差数列的公差。dtype:设置数组的数据类型。axis

:沿着指定轴在多维数组上生成数组元素,默认为0。linspace函数语法格式:linspace(start,end,num=50,endpoint=True,retstep=False,dtype=None,axis=0)(2)使用linspace函数根据等差数列创建数组【例9.5】importnumpyasnpa1=np.linspace(1,6,num=3)print(a1)#输出:[1.3.56.]a2=np.linspace([1,2],[6,7],num=3,axis=0)print(a2)#输出:[[1.2.][3.54.5][6.7.]]a3=np.linspace([1,2],[6,7],num=3,axis=1)print(a3)#输出:[[1.3.56.][2.4.57.]]【特别提示】(1)如果start和end均为数值,则axis只能为0。生成的是一维数组。(2)如果start和end均为一维数组,则axis只能为0或1。生成的是二维数组。(3)如果start和end均为二维数组,则axis只能为0、1或2。生成的是三维数组第9章NumPy库的使用9.1.2创建数组9.1NumPy数组应用基础3.根据给定的数值范围创建数组geomspace函数语法格式:geomspace(start,end,num=50,endpoint=True,retstep=False,dtype=None,axis=0)(3)使用geomspace函数按等比数列创建数组【例9.6】importnumpyasnpar=np.geomspace(1,1024,11)print(ar)#输出结果:[1.000e+002.000e+004.000e+008.000e+001.600e+013.200e+016.400e+011.280e+022.560e+025.120e+021.024e+03]【特别提示】该函数的参数与linspace函数类似,但创建数组的数据元素组成等比数列。其中参数start和end的值不能是0。1是2的0次幂,1024是2的10次幂,相邻两个元素的比值为2,输出结果正确,只不过数结果数值用科学计数法显示,如果想看着简洁,可以在输出前添加如下代码:np.set_printoptions(suppress=True)#输出结果为:[1.2.4.8.16.32.64.128.256.512.1024.]set_printoptions函数允许自定义数组的打印方式,包括设置数组元素的显示精度、数组的打印宽度、是否使用科学计数法等。第9章NumPy库的使用9.1.2创建数组9.1NumPy数组应用基础3.根据给定的数值范围创建数组参数说明:与geomspace函数的参数基本相同。但创建的是在对数刻度上均匀分布的数组,base指定对数的底数(默认值为10)。数列首项为base**start、结束项为base**end。logspace函数语法格式:logspace(start,end,num=50,endpoint=True,base=10,retstep=False,dtype=None,axis=0)(4)使用logspace函数按等比数列创建数组【练一练9.5】分别利用geomspace函数和logspace函数创建一个从1到1000(包括1000)的包含4个数组元素的等比数列.4.创建随机数组(1)使用rand函数创建服从均匀分布的随机数组rand函数语法格式:rand(d0,d1,...,dn)参数说明:d0,d1,...,dn是可选参数,用于指定数组各维度的大小。缺省时返回一个单独的随机浮点数,数组元素为取值在[0,1)区间的随机数,数组元素的值均匀分布。【练一练9.6】利用rand函数创建一个3行4列的二维随机数组,数组元素为[0,1)均匀分布的随机数。第9章NumPy库的使用9.1.2创建数组9.1NumPy数组应用基础4.创建随机数组参数说明:low:指定随机数范围的下限(默认值为0.0)。high:指定随机数范围的上限(默认值为1.0),生成[low,high)上均匀分布的随机数。size:指定生成数组的形状,可以是整数或元组,缺省时返回一个随机浮点数。uniform函数语法格式:uniform(low=0,high=1.0,size=None)(2)使用uniform函数创建服从均匀分布的随机数组(3)使用randn函数创建服从标准正态分布的随机数组randn函数语法格式:randn(d0,d1,...,dn)参数说明:d0,d1,...,dn指定生成数组的形状。可以是整数或元组。缺省时返回一个服从标准正态分布(均值为0,标准差为1)的单个随机浮点数,其值可能为负数或正数。【练一练9.7】利用randn函数创建一个5×6的二维随机数组。【例9.7】使用uniform函数创建在[0,100)上均匀分布的形状为(2,3)的二维随机数组。importnumpyasnpar=np.random.uniform(0,100,(2,3))print(ar)第9章NumPy库的使用9.1.2创建数组9.1NumPy数组应用基础4.创建随机数组参数说明:loc:指定正态分布的均值(期望值,默认值为0.0),均值决定了分布的中心位置。scale:指定正态分布的标准差,默认值为1.0。size:指定生成数组的形状,可以是整数或元组,缺省时返回一个单独的随机浮点数。normal函数语法格式:normal(loc=0.0,scale=1.0,size=None)(4)使用normal函数创建服从正态分布的随机数组(5)使用randint函数创建随机整数数组randint函数语法格式:randint(low,high=None,size=None,dtype=int)参数说明:low::随机整数范围的下限。high:指定随机整数范围的上限(不包含),默认值为0)。size:指定生成数组的形状,可以是整数或元组。dtype:指定生成数组的数据类型,默认值为int。【练一练9.7】创建服从均值为1.6、标准差为0.8的正态分布的二维随机数组。【例9.8】importnumpyasnpa=np.random.randint(10,size=(2,3))

#a是形状为(2,3)的二维数组,参数low=0、high=10b=np.random.randint(1,10,3)#b是包含3个元素的一维数组。参数low=1、high=10print(a)print(b)第9章NumPy库的使用9.1.2创建数组9.1NumPy数组应用基础4.创建随机数组参数说明:a:整数或一维数组。size:指定生成数组的形状,可以是整数或元组,缺省时返回一个单独的随机元素。replace:设置元素能否重复,默认值为True,表示数组元素可重复,如果为False则表示数组元素不重复。p::一维数组,指定a中每个元素被抽取的概率。choice函数语法格式:choice(a,size=None,replace=True,p=None)(6)使用choice函数从给定的一维数组中随机抽样创建数组【例9.9】importnumpyasnpa=np.array([1,2,3,4,5,6])b=np.random.choice(10,size=(2,3))c=np.random.choice(a,size=3,replace=False)[123456][[995][917]][234]程序运行结果如下:第9章NumPy库的使用9.1.2创建数组9.1NumPy数组应用基础4.创建随机数组参数说明:x:可以是整数或一维数组或多维数组。x是整数时,返回[0,x-1]上的整数的随机排列。x是一维数组时,返回x的随机排列。permutation函数语法格式:permutation(x)(7)使用permutation生成随机排列或随机打乱数组元素的顺序【练一练9.9】生成一个[0,10]上的整数乱序后的一维随机数组。(8)使用shuffle函数随机打乱数组元素顺序shuffle函数语法格式:random.shuffle函数(x)参数说明:X:一维数组或者多维数组。如果x是多维数组,只会对第一维的元素顺序进行打乱,子数组的内容保持不变。【特别提示】各随机函数生成的随机数是伪随机数,其随机性基于一个初值(种子)。可以使用random.seed函数设置种子。seed函数语法格式:seed(seed)【练一练9.10】分别使用相同的随机种子和不同的随机种子,利用rand函数创建2个二维随机数组。观察生成的二个数组的元素是否相同,并分析原因。第9章NumPy库的使用9.1.3数组基本操作9.1NumPy数组应用基础1.数组的索引与切片基本索引允许使用整数或切片来访问数组元素,适用于按位置访问数组元素,简单直观,是最基础的索引方式。(1)基本索引【例9.10】importnumpyasnpa=np.array([10,20,30,40,50]) #创建一维数组print(a[2],a[-2]) #输出:3040print(a[1:4]) #输出:[203040](2)布尔索引布尔索引允许使用布尔数组来选择数组中的元素,布尔数组的形状必须和数组形状相同。一般用于根据条件从数组中筛选数据。importnumpyasnparr=np.array([1,2,3,4,5])print("数组中大于3的元素:",arr[arr>3])#输出:[45]【练一练9.12】根据[[1,2,13],[4,15,6],[7,18,19]]创建二维数组,并筛选出大于10的全部奇数。也可以使用逗号分隔不同维度的索引访问多维数组的元素:a[1,0]:第1维度索引为1、第2维度索引为0的元素即a[1][0]。a[2,1,1]:第1维度索引为2、第2维度索引为1、第3维度索引为1的元素即a[2][1][1]。a[:,1]:第1维度取全部索引、第2维度索引为1的元素即[[34][78][1112]]。a[:,0,:]):第1、3维度取全部索引、第2维度索引为0的元素即[[12][56][910]]。【例9.11】【特别提示】(1)布尔索引同样适用于多维数组。(2)布尔索引得到的数组是一维数组。(3)可以在布尔索引里使用多个条件,支持逻辑运算符“

&”(逻辑与)、“|”(逻辑或)、“~”(逻辑非))。【练一练9.11】确定a[1:]、a[2][::-1]、a[1][0][::]、a[1:,:1,0]的值并尝试修改这些数据。第9章NumPy库的使用9.1.3数组基本操作9.1NumPy数组应用基础1.数组的索引与切片花式索引允许使用整数数组作为数组任意维度的索引。(3)花式索引【例9.12】importnumpyasnpa=np.array([1,2,3,4,5])print(a[[1,3]])#输出:[24]b=np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]])print(b[[1,3]])#输出:[[456][101112]]print(b[[0,2],[1,2]])#输出:[29]【练一练9.13】分别输出b[[0,2],1]、b[0,[1,2]]、b[0:,[1,2]]的值,观察输出结果并分析原因。【特别提示】对于二维数组的花式索引b[[0,2],[1,2]]),会根据第一个索引数组[0,2]和第二个索引数组[1,2]对应位置的元素组合成坐标对(0,1)、(2,2),然后从二维数组b中选取这些坐标位置的元素,最终将这些元素组合成一个一维数组返回。因此,第一个索引数组和第二个索引数组的元素个数必须相同。第9章NumPy库的使用9.1.3数组基本操作9.1NumPy数组应用基础2.改变数组的形状使用数组的reshape方法允许指定一个新的形状,要求新数组的总元素数量必须与原始数组的总元素数量相同。(1)使用reshape方法【例9.13】importnumpyasnpa=np.arange(1,7)#创建一维数组#使用reshape改变形状re_arr=a.reshape((2,3))#将数组形状改为(2,3):2行3列print(re_arr)#输出结果[[123][456]]【练一练9.14】使用列表[1,2,3,4]创建一维数组a,再利用reshape函数根据数组a创建形状为(2,2)的新数组b。设置b[0,0]=6后,观察a和b的元素变化。参数说明:shape:设置新数组的形状,可以是整数或元组。order:指定数组在内存中的存储顺序,取值可以是'C'(按行优先存储,为默认值)、'F'(按列优先存储)、'A'(使用原数组的存储方法)。reshape方法语法格式:ndarray.reshape(shape,order=’C’)第9章NumPy库的使用9.1.3数组基本操作9.1NumPy数组应用基础2.改变数组的形状使用数组的resize方法可直接改变原数组的形状和大小,返回值是None。(2)使用resize方法【特别提示】numpy模块也提供了resize(ndarray,shape)函数,用于创建形状为shape的数组,并使用数组ndarray的元素循环填充,该函数不改变ndarray数组。【练一练9.15】据列表[1,2,3,4,5,6]创建一维数组,并将其形状修改为(3,4)。分别使用numpy模块的resize函数和数组的resize方法。比较结果的不同并分析原因。。参数说明:shape:指定数组的新形状,可以是一个整数或元组。refcheck:检查数组是否有其他引用。resize方法语法格式:ndarray.resize(shape,refcheck=True)(3)组合使用flatten方法和reshape方法flatten方法语法格式:ndarray.flatten(order=’C’)可以先使用数组的flatten方法将多维数组转换为一维数组,然后再用reshape方法创建新数组。importnumpyasnpa=np.array([[1,2,3],[4,5,6]])#创建二维数组,2行3列f=a.flatten()#用flatten方法转换为一维数组b=f.reshape((3,2))#形状修改为(3,2):3行2列print(b)#输出3行2列数组[[12][34][56]]【例9.14】第9章NumPy库的使用9.1.3数组基本操作9.1NumPy数组应用基础3.数组的转置在NumPy中,数组转置本质上是轴的交换。对于二维数组,转置就是将数组的行和列互换,即将原来的行变为列,原来的列变为行。(1)使用数组的swapaxes方法importnumpyasnparr=np.array([[1,2,3],[4,5,6]])t_arr=arr.swapaxes(0,1)print(t_arr)#输出结果:[[14][25][36]]【练一练9.16】利用transpose方法完成例9.5的操作。swapaxes方法语法格式:ndarray.swapaxes(axis1,axis2)(3)使用T属性使用数组的T属性,相当于使用数组的未传递参数的transpose方法。【特别提示】(1)数组转置后得到的数组是原数组的一个视图。该视图与原数组共享底层的内存数据。(2)轴的交换,只是对数据索引方式的改变。例如,将三维数组a的轴0与轴1交换,得到数组b。那么,a的元素a[i,j,k]就是b的元素b[j,i,k]。(3)NumPy也提供了内置函数swapaxes和transpos,使用方法与数组的同名方法基本相同。【例9.15】(2)使用数组的transpose方法transpose方法语法格式:ndarray.transpose(*axes))第9章NumPy库的使用9.1.3数组基本操作9.1NumPy数组应用基础4.数组拼接concatenate是用于连接多个数组的函数,它能够将多个数组沿着指定的轴拼接在一起,生成一个新的数组。(1)使用concatenate函数importnumpyasnpa=np.array([[1,2],[3,4]])b=np.array([[5,6],[7,8]])c=np.concatenate((a,b),axis=1)#水平拼接print(c) #输出结果:[[1256][3478]]d=np.concatenate((a,b),axis=0)#垂直拼接print(d) #输出结果:[[12][34][56][78]]concatenate函数语法格式:concatenate((a1,a2,...),axis=0,out=None)【例9.16】参数说明:(a1,a2,...):是一个包含多个数组的元组或列表,这些数组需要具有相同的形状。axis:指定沿着哪个轴进行数组的连接操作。out:可选参数,用于存储结果的目标数组。(2)使用hstack或vstack函数hstack或vstack函数语法格式hstack(tup)、vstack(tup)参数说明:tup是一个包含多个数组的元组或列表。hstack((a,b))

等价于

np.concatenate((a,b),axis=1)。vstack((a,b))

等价于

np.concatenate((a,b),axis=0)。【练一练9.17】利用hstack或vstack函数完成【例9.16】操作。第9章NumPy库的使用9.1.3数组基本操作9.1NumPy数组应用基础5.数组拆分(1)使用split函数拆分数组importnumpyasnparr=np.array([[1,2],[3,4],[5,6],[7,8]])pt1=np.split(arr,[1],axis=0) #在行索引1处拆分出上下两个部分print(pt1)#输出:[array([[1,2]]),array([[3,4],[5,6],[7,8]])]pt2=np.split(arr,[1],axis=1)#在列索引1处拆分出左右两个部分print(pt2)#输出:[array([[1],[3],[5],[7]]),array([[2],[4],[6],[8]])]split函数语法格式:split(ndarray,indices_or_sections,axis=0)【例9.17】参数说明:Ndarray:是要拆分的数组。indices_or_sections:可以是整数或一维数组,如果是整数表示要将数组平均拆分为多少个子数组,如果是一维数组,则表示拆分的索引位置。axis:指定拆分的轴,默认为0。。(2)使用hsplit或vsplitt函数拆分数组hsplit或vsplit函数语法格式hsplit(ndarray,indices_or_sections)vsplit(ndarray,indices_or_sections))参数说明:各参数的含义与split同名参数相同。【练一练9.17】利用hsplit或vsplit函数完成【例9.17】的操作。第9章NumPy库的使用9.1.3数组基本操作9.1NumPy数组应用基础6.使用.npy文件存取数组.npy格式文件是一种高效存储和加载NumPy数组的二进制文件格式。它以二进制形式保存数组的元数据(如数组的形状、数据类型等)和实际数据,可以方便快速地存取数组。(1)使用save函数将数组保存到.npy文件save函数语法格式:save(fname,ndarray)【例9.18】参数说明:fname:文件名,文件扩展名建议使用“.npy”(缺省扩展名时会被自动添加)。ndarray:要保存的NumPy数组。(2)使用load函数从.npy文件中读取数组load函数语法格式:load(fname)参数说明:fname是.npy文件。importnumpyasnpa=np.array([[1,2,3],[4,5,6]])np.save("datas.npy",a) #数组保存到.npy文件b=np.load("datas.npy") #从.npy文件中读取数组print(b)#输出:第9章NumPy库的使用9.1.3数组基本操作9.1NumPy数组应用基础7.使用文本文件存取数组(1)使用savetxt函数将数组保存到文本文件savetxt函数语法格式:savetxt(fname,ndarray,fmt='%.18e',delimiter='',newline='\n',header='',footer='',comments='#',encoding=None)【例9.19】参数说明:‌fname:要保存的文件名。ndarray:要保存的数组(只能是一维数组或二维数组)。‌encoding:编码方式,缺省时为None,表示使用系统默认编码。fmt:数据格式,例如'%d'表示整数,'%.18e'表示科学计数法,默认为科学计数法。delimiter:分隔符,默认为空格。newline:行分隔符,默认为换行符。header:文件头部内容,默认为空。footer:文件尾部内容,默认为空。comments是注释符号,默认为'#'。(2)使用loadtxt函数从文本文件中读取数组loadtxt函数语法格式:loadtxt(fname,dtype=float,comments='#',delimiter=None,skiprows=0,max_rows=None,encoding='bytes')参数说明:fname:被读文件路径或文件对象。dtype:读取数据时的数据类型。comments:用来跳过文件中指定参数开头的行。delimiter:指定读取文件中数据的分割符。skiprows:选择跳过的行数。max_rows:指最大读取的行数。encoding:编码方式,必须与savetxt将数组写入文件时使用的编码方式相同。importnumpyasnpa=np.array([[1,2,3],[4,5,6]])np.savetxt("txtdatas.txt",a,encoding="GBK")#数组写入文本文件b=np.loadtxt("txtdatas.txt",encoding="GBK")#从文本文件中读取数组9.2数组的运算9.2.1数组与数组的运算9.2.2数组与标量的运算9.2.3数组运算的广播机制第9章NumPy库的使用9.2.1数组与数组的运算9.2数组的运算【例9.20】NumPy允许对两个形状相同的数组进行:算术运算(+、-、*、/、//、%、**)、比较运算(<、<=、>、>=、==、!=)、逻辑运算(&、|、~)位运算(&、|、~、^、<<、>>)。而且,除比较运算符外,其他运算符均可以与赋值符“=”结合使用。两个形状相同的数组进行以上运算,本质上就是两个数组相同索引位置的元素进行运算。importnumpyasnparr1=np.array([1,2,3,4,5])arr2=np.array([2,3,1,5,9])print(arr1*arr2) #逐元素相乘,输出:[2632045]print(arr1//arr2) #逐元素整除,输出结果:[00300]print(arr1>arr2) #逐元素比较,输出结果:[FalseFalseTrueFalseFalse]print(arr1&arr2) #逐元素按位与,输出结果:[02141]print(arr1<<arr2) #逐元素按位左移,输出结果:[41661282560]arr2+=arr1 #等效于arr2=arr2+arr1print(arr2) #输出:[354914]【特别提示】运算符&、|、~既是逻辑运算符,也是位运算符。如果两个数组均是布尔数组,则进行逻辑运算,否则,进行位运算。【练一练9.19】(1)创建两个同形状的二维数组(元素均为整数),分别进行算术运算、比较运算、逻辑运算和位运算。(2)创建两个同形状的二维数组(元素均为逻辑值)并进行&、|和~运算。第9章NumPy库的使用9.2.2数组与标量的运算9.2数组的运算【例9.21】数组与标量之间的运算,本质上就是数组的每一个数值元素与标量进行运算importnumpyasnparr=np.array([1,2,3,4,5])print(arr+3) #输出结果:[45678]print(arr>3) #输出结果:[FalseFalseFalseTrueTrue]print(arr<<2) #输出结果:[48121620]print(arr/10) #输出结果:[0.10.20.30.40.5]第9章NumPy库的使用9.2.3数组运算的广播机制9.2数组的运算【例9.22】两个数组之间运算时,是逐个对相同索引位置的元素进行计算。因此,两个进行运算的数组,必须具有相同的形状。利用NumPy提供的广播机制,当数组的形状满足某些规则时,也能直接运算,而不要求形状完全相同。广播机制遵循以下规则:(1)从右向左比较维度:从数组形状的最后一个维度开始到第一个维度结束,逐一比较两个数组对应维度的大小。(2)维度大小匹配规则:

如果两个数组在某个维度上大小相同,那么它们在这个维度上可以进行逐元素运算。

如果其中一个数组在某个维度上的大小为1,那么它可以在这个维度上进行扩展,以匹配另一个数组在该维度上的大小。

如果两个数组在某个维度上的大小既不相同也不为1,那么这两个数组不能广播,抛出ValueError异常。(3)最终形状确定:广播后的数组形状是每个维度上最大的大小。(1)数组与数值的计算假定数组a与数值n进行加法运算:a+n。其运算过程相当于创建一个与数组a具有相同形状的数组b,且使用数值n填充数组b,再运算a+b作为a+n的值。实际上,广播机制并没有真正创建数组b,而是根据广播规则自动处理元素索引,进行a+n的运算。(2)数组与数组的计算设数组a=[[123][456]]

b=[[7][8]],说明a+b为的广播过程。9.3数据统计与分析9.3.1聚合函数与数据汇总9.3.2数组排序与搜索9.3.3数组集合运算函数9.3.4

通用函数第9章NumPy库的使用9.3.1聚合函数与数据汇总9.3数据统计与分析NumPy的聚合函数是用于对数组进行汇总统计操作的一类函数,这些函数可以对数组中的元素进行求和、求均值、求最值等操作,并且支持对指定轴进行计算。1.计算元素的和参数说明:ndarray:要进行求和的数组,必选参数。axis:指定沿着哪个轴进行求和。dtype:指定返回数组的数据类型。out:可选参数,用于指定存储求和结果的数组。keepdims:可选参数,如果设置为True,输出数组会保持与输入数组相同的维度。initial:可选参数,指定求和的初始值。where:可选参数,是一个布尔数组,用于指定哪些元素参与求和。sum函数语法格式:sum(ndarray,axis=None,dtype=None,out=None,keepdims=False,initial=0,where=True)【例9.23】importnumpyasnpa=np.array([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]])#创建三维数组print(np.sum(a)) #全部元素求和,输出:78print(np.sum(a,where=a%3==0))#对能被3整除的元素求和,输出:30b=np.sum(a,axis=0)#对轴0求和,等效于a[0]+a[1]print(b) #输出:[[81012][141618]]b=np.sum(a,axis=1)#对轴1求和,等效于b=np.array([np.sum(a[0],0),np.sum(a[1],0)])print(b) #输出:[[579][171921]]b=np.sum(a,axis=2) #对轴2求和,等效于b=np.array([np.sum(a[0],1),np.sum(a[1],1)])print(b) #输出:[[615][2433]]第9章NumPy库的使用9.3.1聚合函数与数据汇总9.3数据统计与分析2.计算数组元素的均值和中位数参数说明:与sum函数的参数相同。median函数语法格式:median(ndarray,axis=None,out=None,overwrite_input=False,keepdims=False)(2)利用median函数计算数组中元素的中位数(1)利用mean函数计算数组中元素的均值mean函数语法格式:mean(ndarray,axis=None,dtype=None,out=None,keepdims=False,initial=0,where=True)参数说明:ndarray:是要计算中位数的数组,是必选项。axis:指定计算中位数的轴。out:指定存储结果的数组。overwrite_input:默认为False,如果设置为True,函数可能会对输入数组a进行修改以提高计算效率,需谨慎使用。Keepdims:默认为False,如果设置为True,输出数组将保持与输入数组相同的维度,只是在计算中位数的轴上维度大小变为1。【练一练9.21】将上例中的sum函数分别替换为mean和median,观察、理解输出结果。第9章NumPy库的使用9.3.1聚合函数与数据汇总9.3数据统计与分析3.查找数组元素的最大值和最小值参数说明:与sum函数的参数相同。std函数和var函数语法格式:std(ndarray,axis=None,dtype=None,out=None,ddof=0,keepdims=False,where=None)var(ndarray,axis=None,dtype=None,out=None,ddof=0,keepdims=False,where=None)(1)使用max、min函数查找数组中的最大值、最小值max函数和min函数语法格式:max(ndarray,axis=None,out=None,keepdims=False,where=True)min(ndarray,axis=None,out=None,keepdims=False,where=True)参数说明:ddof:表示自由度,默认值为0,std计算的是总体标准差,var计算的是总体方差;当ddof=1时,std计算的是样本标准差,var计算的是样本方差。其他参数参阅sum函数的同名参数。【练一练9.22】对于例9.23中的数组a,分别在axis为None、0、1或2的情形下输出a的最大值、最小值。4.计算数组元素的标准差和方差【例9.24】importnumpyasnpa=np.random.randint(0,100,1000)#创建一维数组,包含1000个[0,99]上的随机整数print(np.std(a)) #输出数组全部元素的总体标准差print(np.var(a,where=(a>=60)&(a<80)))

#输出在[60,79]上的全部元素的总体方差print(np.var(a,ddof=1))#输出数组全部元素的样本方差第9章NumPy库的使用9.3.2数组排序与搜索9.3数据统计与分析1.数组排序参数说明:ndarray:要进行排序的数组。axis:指定沿着哪个轴进行排序,kind:指定排序算法,可取值'quicksort'(快速排序,这是默认的排序算法)。order:为可选参数,当数组是结构化数组(即包含多个字段的数组)时,用于指定按照哪些字段进行排序。flip函数语法格式:flip(ndarray,axis=None)(1)使用sort函数对数组排序sort函数语法格式:sort(ndarray,axis=-1,kind=None,order=None)参数说明:ndarray:要进行反转的数组。axis:指定沿着哪个轴进行元素顺序的反转。【例9.25】importnumpyasnpa=np.array([3,1,4,1,5,9,2,6])sorted_ar1=np.sort(a)print(sorted_ar1)#原数组输出:[11234569]#通过flip函数,对升序排序后的结果数组进行反转,得到降序数组sorted_ar2=np.flip(sorted_ar1)#降序数组print(sorted_ar2)#输出:[96543211]#对多维数组可以指定排序轴,二维数组默认是按axis=1进行排序b=np.array([[3,2,4],[5,0,1]])#2行3列二维数组sorted_ar1=np.sort(b)#按轴1升序排序print(sorted_ar1)#输出:[[234][015]]sorted_ar1=np.sort(b,axis=0)#按轴0升序排序print(sorted_ar1)#输出:[[301][524]]print(sorted_ar1[::-1)#按轴0降序排序,输出:[[524][301]]【特别提示】数组的内置函数sort也能实现排序,但该函数无返回值,直接对数组排序。也可利用argsort函数排序,该函数返回的排序后的索引。sort函数是按照升序对数组进行排序的,该函数不支持降序排序。但可通过以下方法得到降序后的数组:使用flip函数,对排序得到的数组反转。第9章NumPy库的使用9.3.2数组排序与搜索9.3数据统计与分析2.数组搜索where函数语法格式1:where(condition,x,y)(1)利用花式索引和布尔索引筛选元素where函数语法格式1:where(condition)参数说明:condition:为布尔数组,用于指定需要满足的条件。当condition为True时,函数返回一个元组,元组中的每个元素是一个一维数组,分别对应满足条件的元素在原数组各维度上的索引。【例9.26】importnumpyasnpa=np.array([[63,82,94],[75,50,81]])b=np.where(a>80) #在数组a中搜索大于80的元素print(b) #输出:(array([0,0,1]),array([1,2,2]))c=np.where(a>80,1,0) #将数组a中大于80的元素替换为1,其他元素替换为0print(c) #输出:[[011][001]]【练一练9.24】对于【例9.25】中的数组a,筛选出能被3整除的全部元素。(2)使用where函数在数组中查找满足条件的元素索引参数说明:condition:为布尔数组,用于指定需要满足的条件。x和y:可以是数组,也可以是单个值。第9章NumPy库的使用9.3.2数组排序与搜索9.3数据统计与分析2.数组搜索argmax和argmin函数语法格式:argmax(ndarray,axis=None,out=None,keepdims=False)argmin(ndarray,axis=None,out=None,keepdims=False)(3)使用argwhere函数在数组中查找非零元素的索引argwhere函数语法格式:argwhere(ndarray)参数说明:ndarray:要查找的数组。argwhere函数返回一个二维数组,其中每一行代表非零元素在原数组中的坐标。【练一练9.25】在上例的数组a中查找最大值和最小值的索引,在数组c中查找非零元素的索引。(2)使用argmax和argmin函数分别返回数组最大值和最小值的索引参数说明:各参数的作用参阅sum函数的同名参数。第9章NumPy库的使用9.3.2数组排序与搜索9.3数据统计与分析3.数组裁剪与分区partition

函数语法格式:partition(ndarray,kth,axis=-1,kind='introselect',order=None)clip函数用于将数组中的元素限制在指定的最小值和最大值之间clip函数语法格式:clip(ndarray,a_min,a_max,out=None)参数说明:ndarray:要进行裁剪操作的数组。a_min:指定裁剪的下限,可以是数值,也可以是与ndarray形状相同的数组a_max:指定裁剪的上限,可以是数值,也可以是与ndarray形状相同的数组,

out:指定存储裁剪结果的数组。importnumpyasnpa=np.array([[63,82,94],[75,50,81]])print(np.clip(a,70,90)) #输出:[[708290][757081]]print(a.clip([70,60,80],90)) #输出:[[708290][756081]](2)数组分区参数说明:ndarray:为要进行分区操作的输入数组。kth:可以是整数或整数数组,如果是整数,则表示要分区的位置(非负整数);如果是整数数组,则会在多个位置进行分区。axis为指定分区的轴,默认值为-1,表示在最后一个轴上进行分区操作。kind:用于指定分区算法,默认值为'introselect'(目前仅支持该算法)。order:也是可选参数,是字符串或字符串列表,用于指定在结构化数组中排序的字段。【例9.27】(1)数组剪裁partition

函数用于对数组进行分区操作。第9章NumPy库的使用9.3.3数组集合运算函数9.3数据统计与分析1.使用unique函数找出数组的不重复元素unique函数语法格式:unique(ndarray,return_index=False,return_inverse=False,return_counts=False,axis=None,equal_nan=True)参数说明:Ndarray:输入数组。return_index:默认值为False,若设置为True,函数除了返回唯一元素数组外,还会返回这些元素在原数组中首次出现的索引数组。return_inverse:默认值为False,若设置为True,函数除了返回唯一元素数组外,还会返回一个与原数组形状相同的数组,该数组中的每个元素是原数组对应位置的元素在唯一元素数组中的索引。return_counts:默认值为False,若设置为True,会返回一个数组,该数组记录了每个唯一元素在原数组中出现的次数。axis:指定在哪个轴上查找唯一元素,默认值为None(将数组展平为一维数组后查找唯一元素)。equal_nan:默认值为True,控制如何处理NaN(非数字)值。importnumpyasnpa=np.array([[63,82,90],[75,90,81],[82,90,75]])print(np.unique(a)) #输出:[6375818290]b,c=np.unique(a,return_index=True)print(b) #输出:[6375818290]print(c) #输出:[03512]b,c=np.unique(a,return_inverse=True)print(b) #输出:[6375818290]print(c) #输出:[[034][142][341]]b,c=np.unique(a,return_counts=True)print(b) #输出:[6375818290]print(c) #输出:[12123]print(np.unique(a,axis=0))#输出:[[638290][759081][829075]]print(np.unique(a,axis=1))#输出:[[638290][759081][829075]]【例9.29】第9章NumPy库的使用9.3.3数组集合运算函数9.3数据统计与分析1.使用isin函数确定一个数组的元素是否出现在于另一个数组中isin函数语法格式:isin(arr1,arr2,assume_unique=False,invert=False)参数说明:arr1:是要进行判断的输入数组。arr2:可以是单个值、列表、元组或数组,用于确定arr1的元素是否在arr2中。assume_unique:默认为False,如果设置为True,表明arr1和arr2中的元素都是唯一的,这样可以加快计算速度。invert:默认为False,如果设置为True,返回的布尔数组会取反,即表示arr1的元素是否不在arr2中。importnumpyasnpa=np.array([1,2,3,4,5])b=np.array([3,4,5,6])c=np.isin(a,b) #检查a数组中的元素是否出现在数组b中print(c) #输出结果[FalseFalseTrueTrueTrue]print(a[c]) #输出交集:[345]【例9.30】2.使用union1d函数求两个数组的并集union1d函数语法格式:union1d(ar1,ar2)【练一练9.27】设a=np.array([[1,2,3],[3,4,5]]),b=np.array([3,4,5,6])计算a与b的并集。函数返回值:返回两个数组的公共元素升序排序后组成的一维数组,并去重。第9章NumPy库的使用9.3.3数组集合运算函数9.3数据统计与分析3.使用intersect1d函数求两个数组的交集intersect1d函数语法格式:intersect1d(ar1,ar2,assume_unique=False,return_indices=False)参数说明:ar1、ar2均为数组。assume_unique:默认值为False,如果设置为True,表明ar1和ar2中的元素都是唯一的。函数返回值:返回两个数组的差集(是元素升序排序且去重复的一维数组)。importnumpyasnpa=np.array([[5,2,3],[3,4,1]])b=np.array([6,4,5,3])print(ersect1d(a,b)) #输出:[345]print(ersect1d(a,b,return_indices=True)) #输出:(array([3,4,5]),array([2,4,0]),array([3,1,2]))【例9.31】2.使用setdiff1d函数计算两个数组的差集setdiff1d函数语法格式:setdiff1d(ar1,ar2,assume_unique)【练一练9.28】计算上例中a与b的差集。参数说明:ar1、ar2均为数组。assume_unique:默认值为False,如果设置为True,表明ar1和ar2中的元素都是唯一的。return_indices:默认值为False,如果设置为True,函数除了返回交集元素数组外,还会返回两个数组,分别表示交集元素在ar1和ar2中的索引。第9章NumPy库的使用9.3.4通用函数9.3数据统计与分析importnumpyasnpa=np.array([100,200,200])print(np.sqrt(a))#计算平方根,输出:[10.14.1421356214.14213562]print(np.log(a))#计算自然对数,输出:[4.605170195.298317375.29831737]print(np.sin(a))#计算正弦值,输出:[-0.50636564-0.8732973-0.8732973]b=np.array([[112,136,215],[98,210,185]])print(np.maximum(a,b))#求最大值,输出:[[112200215][100210200]]print(np.al

温馨提示

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

评论

0/150

提交评论