版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
云计算技术应用省级专业教学资源库人工智能基础与应用项目三:商品价格折扣系统(任务3-1:numpy基础应用)CONTENTS目录Numpy数组的创建3.1.1ndarray,一个具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组01用于对整组数据进行快速运算的标准数学函数(无需编写循环)02用于读写磁盘数据的工具以及用于操作内存映射文件的工具03线性代数、随机数生成以及傅里叶变换功能04Numpy--NumericalPython的简称高性能科学计算和数据分析的基础包Numpy概述05用于集成由C、C++、Fortran等语言编写的代码的工具数据的维度A=[a1,a2,…,an]一维数组二维数组多维数组Numpy概述数组的创建Numpy的ndarray一种多维数组对象Python已有列表类型,为什么还需要一个数组类型?比如:计算a2+b3,其中a和b是一维数组Numpy概述数组的创建Numpy的引用importnumpyasnp尽管别名可以省略或更改,建议使用上述约定的别名Numpy概述数组的创建NumPy数组是一个多维数组对象,称为ndarray。ndarray数组一般要求所有元素类型相同(同质),数组下标从0开始两部分组成实际的数据描述这些数据的元数据(数据维度、数据类型等)Numpy概述生成一个ndarray数组Ndarray,在程序中别名为array用法:np.array()生成一个ndarray数组,数组的格式为:中括号,元素之间没有逗号(这个和列表可以区分)ar=np.array([1,2,3,4,5,6,7])print(ar)输入[1234567]输出Numpy概述ndarray对象的属性Numpy概述ndarray对象的属性#多维数组ndarrayimportnumpyasnpar=np.array([[1,2,3,4,5,6,7],[1,2,3,4,5,6,7]])print(ar)#输出:
[[1,2,3,4,5,6,7],[1,2,3,4,5,6,7]]print(ar.ndim)#输出:2print(ar.shape)#输出:(2,7)print(ar.size)#输出:14print(ar.dtype)#输出:int32print(ar.itemsize)#输出:4print(ar.data)#输出:<memoryat0x000002ACAD7C1708>Numpy概述Ndarray数组的元素类型数组的创建ndarray为什么要支持这么多种元素类型?对比:Python语法仅支持整数、浮点数和复数3种类型010203科学计算涉及数据量大,对存储和性能都有较高要求对元素类型精细定义,有助于对程序规模有合理评估对元素类型精细定义,有助于numpy合理使用存储空间,优化性能Numpy概述Ndarray数组的创建方法从Python中的列表、元组等类型创建ndarray数组使用NumPy中函数创建ndarray数组从字节流(rawbytes)中创建ndarray数组从文件中读取特定格式,创建ndarray数组Numpy概述使用NumPy中函数创建ndarray数组Numpy概述使用NumPy中函数创建ndarray数组#创建数组:arange(),类似range(),在给定间隔内返回均匀间隔的值。print(np.arange(10))#返回0-9,整型print(np.arange(10.0))#返回0.0-9.0,浮点型print(np.arange(5,12))#返回5-11print(np.arange(5.0,12,2))#返回5.0-12.0,步长为2print(np.arange(10000))#如果数组太大而无法打印,NumPy会自动跳过数组的中心部分,并只打印边角[0123456789][0.1.2.3.4.5.6.7.8.9.][567891011][5.7.9.11.][012...,999799989999]输出Numpy概述使用NumPy中函数创建ndarray数组创建数组:linspace():返回在间隔[开始,停止]上计算的num个均匀间隔的样本。
numpy.linspace(start,stop,num=50,endpoint=True,retstep=False,dtype=None)start:起始值,stop:结束值
num:生成样本数,默认为50endpoint:如果为真,则停止是最后一个样本。否则,不包括在内。默认值为True。retstep:如果为真,返回(样本,步骤),其中步长是样本之间的间距→输出为一个包含2个元素的元祖,第一个元素为array,第二个为步长实际值ar1=np.linspace(2.0,3.0,num=5)ar2=np.linspace(2.0,3.0,num=5,endpoint=False)ar3=np.linspace(2.0,3.0,num=5,retstep=True)print(ar1,type(ar1))print(ar2)print(ar3,type(ar3))输入[2.2.252.52.753.]<class'numpy.ndarray'>[2.2.22.42.62.8](array([2.,2.25,2.5,2.75,3.]),0.25)<class'tuple'>输出Numpy概述使用NumPy中函数创建ndarray数组创建数组:zeros()/zeros_like()/ones()/ones_like()numpy.zeros(shape,dtype=float,order='C'):返回给定形状和类型的新数组,用零填充。shape:数组纬度,二维以上需要用(),且输入参数为整数dtype:数据类型,默认numpy.float64order:是否在存储器中以C或Fortran连续(按行或列方式)存储多维数据。ar1=np.zeros(5)ar2=np.zeros((2,2),dtype=)print(ar1,ar1.dtype)print(ar2,ar2.dtype)输入[0.0.0.0.0.]float64[[00][00]]int32输出Numpy概述使用NumPy中函数创建ndarray数组创建数组:zeros()/zeros_like()/ones()/ones_like()返回具有与给定数组相同的形状和类型的零数组,这里ar4根据ar3的形状和dtype创建一个全0的数组ar3=np.array([list(range(5)),list(range(5,10))])ar4=np.zeros_like(ar3)print(ar3)print(ar4)输入[[01234][56789]][[00000][00000]]输出Numpy概述使用NumPy中函数创建ndarray数组创建数组:ones()/ones_like()和zeros()/zeros_like()一样,只是填充为1[1.1.1.1.1.1.1.1.1.][[[1.1.1.1.][1.1.1.1.][1.1.1.1.]][[1.1.1.1.][1.1.1.1.][1.1.1.1.]]][[11111][11111]]输出ar5=np.ones(9)ar6=np.ones((2,3,4))ar7=np.ones_like(ar3)print(ar5)print(ar6)print(ar7)输入Numpy概述使用NumPy中函数创建ndarray数组创建数组:eye(),创建一个正方的N*N的单位矩阵,对角线值为1,其余为0print(np.eye(5))输入[[
1.0.0.0.0.][0.1.0.0.0.]
[0.0.1.0.0.][0.0.0.1.0.][0.0.0.0.1.]]输出Numpy概述Numpy概述数据的维度数组的创建使用NumPy中函数创建ndarray数组云计算技术应用省级专业教学资源库谢谢观看Thankyouforwatching云计算技术应用省级专业教学资源库人工智能基础与应用项目三:商品价格折扣系统(任务3-1:numpy基础应用)CONTENTS目录Numpy随机数3.1.21.简单随机数:产生简单的随机数据,可以是任何维度2.排列:将所给对象随机排列3.分布:产生指定分布的数据,如高斯分布等4.生成器:种随机数种子,根据同一种子产生的随机数是相同的numpy.random模块分为四个部分,对应四种功能函数说明seed确定随机数生成器的种子permutation返回一个序列的随机排列或返回一个随机排列的范围shuffle对一个序列就地随机排列rand产生均匀分布的样本值randint从给定的上下限范围内随机选取整数randn产生正态分布(平均值为0,标准差为1)的样本值binomial产生二项分布的样本值normal产生正态(高斯)分布的样本值beta产生Beta分布的样本值chisquare产生卡方分布的样本值gamma产生Gamma分布的样本值uniform产生在[0,1)中均匀分布的样本值输出输入numpy.random.rand(d0,d1,...,dn):生成一个[0,1)之间的随机浮点数或N维浮点数组-均匀分布np.random.rand)(=0.8207np.random.rand)(4=0.28950.91860.78240.6388np.random.rand)(2,3=0.93680.82270.73570.00890.49030.1836输入输出numpy.random.randint(low,high=None,size=None,dtype='l'):生成一个整数或N维整数数组
若high不为None时,取[low,high)之间随机整数,否则取值[0,low)之间随机整数,且high必须大于lowdtype参数:只能是int类型np.random.randint(2)=1np.random.randint(2,size=4)=0101np.random.rand(2,6,(2,3))=432244np.random.randint(2,6,size=4)=3553输入输出numpy.random.shuffle(arr):对arr随机排列numpy.random.permutation(arr):形成一个对arr随机排列的新矩阵3421675arr0:arr5=np.random.permutation)(arr0=2137465arr6=np.random.shuffle)(arr0arr0=5243167输入输入输出输出输入输出np.random.randn(d0,d1,d2,…,dn)生成一个均值为0,方差为1,形状为参数的正态分布样本normal(μ=0.0,σ=1.0,size=None)返回指定均值(μ),方差(σ),形状的正态分布的矩阵输入输出生成器:种随机数种子,根据同一种子产生的随机数是相同的随机数是通过一些复杂的数学算法得到的,那么随机种子(RandomSeed)就是这些随机数的初始值。一般计算机里面产生的随机数都是伪随机数。伪随机数,也就是一个一直不变的数。Numpy随机数云计算技术应用省级专业教学资源库谢谢观看Thankyouforwatching云计算技术应用省级专业教学资源库人工智能基础与应用项目三:商品价格折扣系统(任务3-1:numpy基础应用)CONTENTS目录Numpy数组的保存和加载3.1.3输出输入数组的保存函数将numpy数组保存为自身的npy格式np.save(“npy_file”,arr)np.load(npy_file)数组的加载np.load(“npy_file.npy”
)保存为npy格式输出输入os模块提供了来处理文件和目录的方法os.chdir(path):改变当前工作目录到指定目录,path–要切换到的新路径。os.getcwd()
:用于返回当前工作目录。改变文件存储路径保存为txt格式数组的保存np.savetxt()函数将numpy数组保存为txt文本格式,np.savetxt(“txt_file.txt”,arr)数组的加载np.loadtxt(“txt_file.txt”
)输出输入保存为txt格式数组的保存np.savetxt()函数将numpy数组保存为txt文本格式,np.savetxt(“txt_file.txt”,arr)数组的加载np.loadtxt(“txt_file.txt”
)输出读取csv格式csv文件“CSV”并不是一种单一的、定义明确的格式。在实践中,术语“CSV”泛指具有以下特征的任何文件:纯文本,使用某个字符集,比如ASCII、Unicode、EBCDIC或GB2312;由记录组成(典型的是每行一条记录);每条记录被分隔符分隔为字段(典型分隔符有逗号、分号或制表符;有时分隔符可以包括可选的空格);每条记录都有同样的字段序列。创建csv文件新建一个txt文件,写入数据(如:1,2,3,4,5),中间用英文逗号隔开,然后保存,把后缀名改成CSV。读取csv文件假设已经在csv文件里写进去了[[1,2,3],[4,5,6]],每行的元素是由「分号;」来分隔的。用np.genfromtxt(csv_file,delimiter=‘;’
)即可读取。数组的保存和加载保存为npy格式改变文件存储路径读取csv格式云计算技术应用省级专业教学资源库谢谢观看Thankyouforwatching云计算技术应用省级专业教学资源库人工智能基础与应用项目三:商品价格折扣系统(任务3-2:numpy常用方法解析)CONTENTS目录Numpy数组的索引和切片3.2.1获取数组中特定位置元素的过程。索引获取数组元素子集的过程。切片输出输入一维数组的索引和切片索引:通过中括号指定索引获取第i个数组元素(从0开始)切片:获取子数组,切片符号用(:)表示,
x[start:stop:step]。ar=[0123456789]0123456789ar
[4]
4ar
[3:6]
345输出输入二维数组的索引和切片ar=[[01234][56789]]0123456789ar
[1,3]8ar
[:2,:3]
012567输出输入三维数组的索引和切片ar=[[[123][456]][
[789][101112]]123456789101112ar
[0]
123456ar
[0,1]
456ar
[0,1,1]
5布尔型索引及切片布尔索引,就是用一个由布尔(boolean)类型值组成的数组来选择元素的方法。ar=[[0123][4567][
891011]]01238945671011truefalsetruei
=[truefalsetrue]ar
[i,:]=
[[0123][
891011]]0123891011输入输出数组索引及切片的值更改、复制一个标量赋值给一个索引/切片时,会自动改变/传播原始数组输入输出数组的索引数组的切片云计算技术应用省级专业教学资源库谢谢观看Thankyouforwatching云计算技术应用省级专业教学资源库人工智能基础与应用项目三:商品价格折扣系统(任务3-2:numpy常用方法解析)CONTENTS目录Numpy数组的索引和切片3.2.2数组的操作获取数组中特定位置元素的过程。索引获取数组元素子集的过程。切片ar=np.arange(20)print(ar)print(ar[4])print(ar[3:6])一维数组的索引和切片输入[012345678910111213141516171819]4[345]输出二维数组的索引和切片ar=np.arange(16).reshape(4,4)print(ar,'数组轴数为%i'%ar.ndim)#4*4的数组print(ar[2],'数组轴数为%i'%ar[2].ndim)#切片为下一维度的一个元素,所以是一维数组print(ar[2][1])#二次索引,得到一维数组中的一个值print(ar[1:3],'数组轴数为%i'%ar[1:3].ndim)#切片为两个一维数组组成的二维数组print(ar[2,2])#切片数组中的第三行第三列→10print(ar[:2,1:])#切片数组中的1,2行、2,3,4列→二维数组输入[[0123][4567][891011][12131415]]数组轴数为2[891011]数组轴数为19输出[[4567][891011]]数组轴数为210[[123][567]]三维数组的索引和切片ar=np.arange(8).reshape(2,2,2)print(ar,'数组轴数为%i'%ar.ndim)#2*2*2的数组print(ar[0],‘数组轴数为%i'%ar[0].ndim)#三维数组的下一个维度的第一个元素
→
一个二维数组print(ar[0][0],'数组轴数为%i'%ar[0][0].ndim)#三维数组的下一个维度的第一个元素下
的第一个元素→一个一维数组print(ar[0][0][1],'数组轴数为%i'%ar[0][0][1].ndim)输入[[[01][23]][[45][67]]]数组轴数为3[[01]输出
[23]]数组轴数为2[01]数组轴数为11数组轴数为0多维数组的索引每个维度一个索引值,逗号分隔多维数组的切片布尔型索引及切片ar=np.arange(12).reshape(3,4)i=np.array([True,False,True])j=np.array([True,True,False,False])print(ar)print(i)print(j)print(ar[i,:])#在第一维度做判断,只保留True,这里第一维度就是行,ar[i,:]=ar[i](简单书写格式)print(ar[:,j])#在第二维度做判断,这里如果ar[:,i]会有警告,因为i是3个元素,而ar在列上有4个#布尔型索引:以布尔型的矩阵去做筛选m=ar>5print(m)#这里m是一个判断矩阵print(ar[m])#用m判断矩阵去筛选ar数组中>5的元素→重点!后面的pandas判断方式原理就来自此处输入[[0123][4567][891011]][TrueFalseTrue][TrueTrueFalseFalse][[0123][891011]][[01][45][89]][[FalseFalseFalseFalse][FalseFalseTrueTrue][TrueTrueTrueTrue]][67891011]输出数组索引及切片的值更改、复制ar=np.arange(10)print(ar)ar[5]=100ar[7:9]=200print(ar)#一个标量赋值给一个索引/切片时,会自动改变/传播原始数组ar=np.arange(10)b=ar.copy()b[7:9]=200print(ar)print(b)#复制输入[0123456789][0123410062002009][0123456789][01234562002009]输出数组的索引数组的切片云计算技术应用省级专业教学资源库谢谢观看Thankyouforwatching云计算技术应用省级专业教学资源库人工智能基础与应用项目三:商品价格折扣系统(任务3-2:numpy常用方法解析)CONTENTS目录Numpy数组的排序3.2.3数组的排序:直接排序和间接排序数组的添加和删除:insert,delete数组的视图和复制:view,copy输入importnumpyasnparr=np.array([5,3,2,6,1,4])print('排序前arr=',arr)arr.sort()print('排序后arr=',arr)直接排序sort()函数:原地(in-place)排序,即在原数组操作而不需要新创建一个数组。用法:arr.sort()注意:sort()函数只能升序排序,若要按照降序排序,需要使用arr[::-1]得到新数组输出arr1=arr[::-1]print("降序排序的数组为:",arr1)输入直接排序sort()函数排序有两种用法:第一种:arr.sort(),原地排序,改变原数组第二种:np.sort(arr),在排序时复制了arr再排序,因此不会改变arr输出importnumpyasnpnp.random.seed(1031)arr=np.random.randint(40,size=(3,4))print("原数组为:\n",arr)arr[:,0].sort()print("对第一列进行排序后的数组:\n",arr)print("对第二列排序为:",np.sort(arr[:,1]))print("原数组为:\n",arr)输入importnumpyasnpnp.random.seed(1031)arr=np.random.randint(40,size=(3,4))print("原数组为:\n",arr)arr.sort(axis=1)print("按行排序为:\n",arr)arr.sort(axis=0)print("按列排序为:\n",arr)直接排序sort()函数也可以在不同的轴上排序。对于二维数组,在「轴0」上排序是「跨行」排序,在「轴1」上排序是「跨列」排序。输出输入间接排序argsort()函数提取排好的新数组中每个元素在原数组对应的索引
(index)输出importnumpyasnpscore=np.array([100,60,99,80,91])idx=score.argsort()print(idx)idx=[13420]存储着排序后的元素在原数组中的位置索引数组按照升序排序后的结果为[60809199100]60在原数组中的索引为1,因此idx的第一个元素是1同理80在原数组中的索引为3,因此idx的第二个元素为3依此类推就能够明白这个函数的真实涵义。
间接排序argsort()函数提取排好的新数组中每个元素在原数组对应的索引
(index)实例:创建一个二维数组,根据第一行排序的结果调整其他行的顺序。分析: 1.用argsort()函数得到位置索引idx 2.将idx用到所有行上,使用花式索引得到最后结果间接排序lexsort():用于对多个序列进行排序。把它想象成对电子表格进行排序,每一列代表一个序列,排序时优先照顾参数中靠后的列。这些序列在传入lexsort()函数封装成元组格式。输入输出first_name=np.array(['Bob','Amy','Steve','Bill','Amy'])last_name=np.array(['Jimmy','Alice','Alice','Jimmy','William'])idx=np.lexsort((first_name,last_name))print(idx)print(last_name[idx])print(first_name[idx])先按last_name升序排列,得到['Alice','Alice','Jimmy','Jimmy','William']然后再按first_name升序排列这两个在last_time中打成平手的词,最终得到结果-last_name排完后['Alice','Alice','Jimmy','Jimmy','William']-first_name排完后['Amy','Steve','Bill','Bob','Amy']将排好的两个数组里的元素找到原来两个数组对应的位置索引,记做idx。输入添加和删除insert():在某个特定位置之前插入元素delete():
删除某些特定元素输出arr=np.arange(6)print("原数组为:",arr)print("在下标为1处插入元素100:",np.insert(arr,1,100))print("删除下标为1和3的元素:",np.delete(arr,[1,3]))注意:插入和删除操作不会改变原数组输入arr=np.arange(4)arr_view=arr.view()print('更改arr_view之前,arr=',arr)arr_view[-1]=9print('更改arr_view之后,arr=',arr)视图和复制用view()函数来对arr做视图得到arr_view,指向arr但没有复制它,改变arr_view里面的元素,会改变原数组arr。用copy()函数来对arr做复制的得到arr_copy,改变arr_copy里面的元素,不改变原数组arr。输出arr_copy=arr.copy()print('更改arr_copy之前,arr=',arr)arr_copy[-1]=9print('更改arr_copy之后,arr=',arr)数组的排序:直接排序和间接排序数组的添加和删除:insert,delete数组的视图和复制:view,copy云计算技术应用省级专业教学资源库谢谢观看Thankyouforwatching云计算技术应用省级专业教学资源库人工智能基础与应用项目三:商品价格折扣系统(任务3-2:numpy常用方法解析)CONTENTS目录numpy常用方法解析3.2.4数组的维度变换copy方法生成数组及其数据的完整拷贝数组的复制ar1=np.arange(10)ar2=ar1print(ar2isar1)ar1[2]=9print(ar1,ar2)#回忆python的赋值逻辑:指向内存中生成的一个值→这里ar1和ar2指向同一个值,所以ar1改变,ar2一起改变ar3=ar1.copy()print(ar3isar1)ar1[0]=9print(ar1,ar3)输入True[0193456789][0193456789]False[9193456789][0193456789]输出数组的类型转换astype()方法会创建一个新的数组(原始数据的一个拷贝)b=a.astype(np.float)ndarray数组向列表转换:tolist方法会将数组转换成列表ls=a.tolist()数组的类型转换#数组类型转换:.astype()ar1=np.arange(10,dtype=float)print(ar1,ar1.dtype)print('-----')#可以在参数位置设置数组类型ar2=ar1.astype(32)print(ar2,ar2.dtype)print(ar1,ar1.dtype)#a.astype():转换数组类型#注意:养成好习惯,数组类型用32,而不是直接int32输入[0.1.2.3.4.5.6.7.8.9.]float64-----[0123456789]int32[0.1.2.3.4.5.6.7.8.9.]float64输出数组的堆叠#numpy.stack(arrays,axis=0):沿着新轴连接数组的序列,形状必须一样!#重点解释axis参数的意思,假设两个数组[123]和[456],shape均为(3,0)#axis=0:[[123][456]],shape为(2,3)#axis=1:[[14][25][36]],shape为(3,2)a=np.arange(5)#a为一维数组,5个元素b=np.arange(5,9)#b为一维数组,4个元素ar1=np.hstack((a,b))#注意:((a,b)),这里形状可以不一样print(a,a.shape)print(b,b.shape)print(ar1,ar1.shape)a=np.array([[1],[2],[3]])#a为二维数组,3行1列b=np.array([['a'],['b'],['c']])#b为二维数组,3行1列ar2=np.hstack((a,b))#注意:((a,b)),这里形状必须一样print(a,a.shape)print(b,b.shape)print(ar2,ar2.shape)print('-----')输入[01234](5,)[5678](4,)[012345678](9,)[[1][2][3]](3,1)[['a']['b']['c']](3,1)[['1''a']['2''b']['3''c']](3,2)输出数组的堆叠#numpy.hstack(tup):水平(按列顺序)堆叠数组a=np.arange(5)b=np.arange(5,10)ar1=np.vstack((a,b))print(a,a.shape)print(b,b.shape)print(ar1,ar1.shape)a=np.array([[1],[2],[3]])b=np.array([['a'],['b'],['c'],['d']])ar2=np.vstack((a,b))#这里形状可以不一样print(a,a.shape)print(b,b.shape)print(ar2,ar2.shape)print('-----')-----[01234](5,)[56789](5,)[[01234][56789]](2,5)[[1][2][3]](3,1)[['a']['b']['c']['d']](4,1)[['1']['2']['3']['a']['b']['c']['d']](7,1)数组的堆叠-----[01234](5,)[56789](5,)[[01234][56789]](2,5)[[05][16][27][38][49]](5,2)#numpy.vstack(tup):垂直(按列顺序)堆叠数组a=np.arange(5)b=np.arange(5,10)ar1=np.stack((a,b))ar2=np.stack((a,b),axis=1)print(a,a.shape)print(b,b.shape)print(ar1,ar1.shape)print(ar2,ar2.shape)#numpy.stack(arrays,axis=0):沿着新轴连接数组的序列,形状必须一样!#重点解释axis参数的意思,假设两个数组[123]和[456],shape均为(3,0)#axis=0:[[123][456]],shape为(2,3)#axis=1:[[14][25][36]],shape为(3,2)数组的拆分数组与标量之间的运算数组与标量之间的运算作用于数组的每一个元素NumPy的一元函数NumPy一元函数:对ndarray中的数据执行元素级运算的函数NumPy的二元函数数组的简单运算ar=np.arange(6).reshape(2,3)print(ar+10)#加法print(ar*2)#乘法print(1/(ar+1))#除法print(ar**0.5)#幂#与标量的运算print(ar.mean())#求平均值print(ar.max())#求最大值print(ar.min())#求最小值print(ar.std())#求标准差print(ar.var())#求方差print(ar.sum(),np.sum(ar,axis=0))#求和,np.sum()→axis为0,按列求和;axis为1,按行求和print(np.sort(np.array([1,4,3,2,5,6])))#排序[[101112][131415]][[024][6810]][[1.0.50.33333333][0.250.20.16666667]][[0.1.1.41421356][1.732050812.2.23606798]]2.5501.707825127662.9166666666715[357][123456]数组的维度变换数组的复制数组的类型转换数组的堆叠NumPy的一元函数NumPy的二元函数数组的简单运算云计算技术应用省级专业教学资源库谢谢观看Thankyouforwatching云计算技术应用省级专业教学资源库人工智能基础与应用项目三:商品价格折扣系统(任务3-3:numpy高级用法分组聚合)CONTENTS目录numpy高级用法分组聚合3.3.1数组运算包括四大类:元素层面(element-wise)运算元素整合(elementaggregation)运算线性代数(linearalgebra)运算广播机制(broadcasting)运算二元运算(binaryoperation):加减乘除数组与标量的运算数组与数组间的运算数学函数:倒数、平方、指数、对数,…比较运算(comparison)输入输出「数组和元素间的二元运算」都是在元素层面上进行的「数组和数组间的二元运算」都是在元素层面上进行的importnumpyasnpnp.random.seed(100)arr1=np.random.randint(5,size=(3,4))arr2=np.random.randint(1,5,size=(3,4))print("数组1:\n",arr1)print("数组2:\n",arr2)print("数组1与2的和为:\n",arr1+2)print("数组1+数组2:\n",arr1+arr2)print("数组1-数组2:\n",arr1-arr2)print("数组1*数组2:\n",arr1*arr2)print("数组1/数组2:\n",arr1/arr2)输出输入「作用在数组上的数学函数」都是作用在数组的元素层面上的。importnumpyasnpnp.random.seed(100)arr1=np.random.randint(1,5,size=(3,4))arr2=np.random.randint(1,5,size=(3,4))print("数组1:\n",arr1)print("数组2:\n",arr2)print(1/arr1)print(arr1**2)print(np.sin(arr1))print(np.sqrt(arr1))print(np.exp(arr1))print(np.log(arr1))输出输入「数组和数组间的比较」都是在元素层面上进行的在「数组和标量3进行比较」时,python先把3复制成和arr1形状一样的数组[[3,3,3],[3,3,3]],然后再在元素层面上作比较。这个复制标量的操作叫做「广播机制」。importnumpyasnpnp.random.seed(100)arr1=np.random.randint(100,size=(3,4))arr2=np.random.randint(100,size=(3,4))print(arr1>arr2)print(arr1<arr2)print(arr1==arr2)print(np.greater(arr1,arr2))print(np.less(arr1,arr2))print(np.array_equal(arr1,arr2))print(np.allclose(arr1,arr2))输出输入线性代数中有大量的矩阵或向量之间的运算。但在NumPy中默认不采用矩阵运算,而是数组运算。矩阵只是二维,而数组可以是任何维度,因此数组运算比矩阵运算更加通用些。如果非要用二维数组arr2d进行矩阵运算,可以通过调用以下函数来实现:np.asmatrix()来创建矩阵A,注意它们的输出有matrix关键词。创建矩阵arr2d=np.array([[1,2],[3,1]])arr2d,type(arr2d)A=np.asmatrix(arr2d)A,type(A)输出输入importnumpyasnparr2d1=np.array([[1,2],[3,4]])A1=np.asmatrix(arr2d1)print(arr2d1,type(arr2d1))print(A1,type(A1))print("arr2d1的转置:\n",arr2d1.T)print("arr2d1的转置:\n",arr2d1.transpose())print("A1的转置:\n",A1.T)数组用arr.T操作或arr.tranpose()函数,而矩阵用A.T操作。转置T只适合二维数据,如果是三维数组呢?数组转置的本质:交换每个轴(axis)的形状(shape)和跨度(stride)。高维数组转置数组转置的本质输出输入importnumpyasnparr1=np.arange(12).reshape((2,2,3))print("原数组为:\n",arr1)arr2=arr1.transpose((1,2,0))print("经过转置得到数组为:\n",arr2)数组转置的本质:交换每个轴(axis)的形状(shape)和跨度(stride)。只要能够计算出转置后的形状,然后通过跨度就能够得到新的数组高维数组转置01278345910116输出输入importnumpyasnparr2d1=np.array([[1,2],[3,4]])A1=np.asmatrix(arr2d1)print("数组的逆为:\n",np.linalg.inv(arr2d1))#数组求逆print("矩阵的逆为:\n",A1.I)#矩阵求逆print("矩阵的逆为:\n",A1**-1)#矩阵求逆数组用np.linalg.inv()函数,而矩阵用A.I和A**-1操作。求逆输出输入相乘在数学上是个严谨的概念,但是在数组和矩阵中是个模棱两可的概念,数组相乘是按照元素层面进行,矩阵相乘是按照数学定义进行相乘importnumpyasnparr1=np.array([[1,2],[3,4]])arr2=np.array([1,2])print("数组arr1:",arr1,"数组arr2:",arr2,sep='\n')print("数组arr1*数组arr2:\n",arr1*arr2,type(arr1*arr2))A1=np.asmatrix(arr1)b=np.asmatrix(arr2).Tprint("b的形状为:",np.shape(b))print("矩阵A1:",A1,"列向量b:",arr2,sep='\n')print("A1*b:\n",A1*b,type(A1*b))如要使数组上相乘符合数学上的定义,用三种写法:用@算术运算符用matmul()函数用dot()函数三种方法在矩阵上也适用。相乘输入A@Anp.matmul(A,b)np.matmul(A,A)np.dot(A,b)np.dot(A,A)A@barr2d@arrnp.matmul(arr2d,arr)np.dot(arr2d,arr)通常高维数组也称为张量,点乘左右两边最常见的数组维度就是向量(1D数组)和向量(1D数组)矩阵(2D数组)和向量(1D数组)矩阵(2D数组)和矩阵(2D数组)点乘np.dot(向量,向量)点乘两个向量实际上就是求它们的内积,即把两个向量每个元素相乘,最后再加总。点乘结果是个标量(0D数组),形状=()。np.dot(矩阵,向量)点乘矩阵和向量实际上做的就是普通矩阵乘以向量。点乘结果是个向量(1D数组)。点乘两个矩阵实际上做的就是普通矩阵乘以矩阵。点乘结果是个矩阵(2D数组)np.dot(矩阵,矩阵)当x是3D数组,y是1D数组,np.dot(x,y)是将x最后一维的元素和y相乘并加总。当x是3D数组,y是2D数组,np.dot(x,y)是将x的最后一维和y的倒数第二维的元素相乘并加总。np.dot(数组,数组)创建矩阵转置高维数组转置求逆相乘点乘云计算技术应用省级专业教学资源库谢谢观看Thankyouforwatching云计算技术应用省级专业教学资源库人工智能基础与应用项目三:商品价格折扣系统(任务3-3:numpy高级用法分组聚合)CONTENTS目录numpy高级用法分组聚合3.3.2数组运算包括四大类:元素层面(element-wise)运算元素整合(elementaggregation)运算线性代数(linearalgebra)运算广播机制(broadcasting)运算二元运算(binaryoperation):加减乘除数组与标量的运算数组与数组间的运算数学函数:倒数、平方、指数、对数,…比较运算(comparison)高维数组还是要用轴(axis)来区分每个维度n维数组就有n层方括号。最外层方括号代表「轴0」即axis=0,依次往里方括号对应的axis的计数加1。在轴上整合二维数组三维数组元素可按不同方式整合。如求和sum()函数,我们可对数组(1)所有的元素求和(2)在某个轴(axis)上的元素求和sum一维数组分析结果:1,2,3的总和是6在轴0(只有一个轴)上的元素求和是6输入arr1d=np.array([1,2,3])print('所有元素总和为',arr1d.sum())print('在轴0上求和为',arr1d.sum(axis=0))输出二维数组分析结果:1到6的总和是21轴0上的元素(被一个红方括号[]包住的)是[1,2,3]和[4,5,6],求和得到[[5,7,9]]轴1上的元素(被两个蓝方括号[]包住的)分别是1,2,3和4,5,6,求和得到[[1+2+3,4+5+6]]=[[6,15]]三维数组分析结果:-1到12的总和是78-轴0上的元素是一个红方括号[]包住的两个[[]],对其求和得到一个[[[]]]-轴1上的元素是两个蓝方括号[]包住的两个[],对其求和得到两个[[]],即[[[]],[[]]]-轴2上的元素是四个绿方括号[]包住的三个标量,对其求和得到四个[],即[[[],[]],[[],[]]]四维数组通用规律:当在某根轴上求和,明晰该轴的元素,再求和。-在轴0上求和,它包含是两个蓝括号[],对其求和-在轴1上求和,它包含是两个绿括号[],对其求和-在轴2上求和,它包含是两个紫括号[],对其求和-在轴3上求和,它包含是三个标量,对其求和整合函数sum,min,max,mean,std,cumsum广播机制当对两个形状不同的数组按元素操作时,可能会触发广播机制(broadcast)。具体做法:先适当复制元素使得这两个数组形状相同后再按元素操作。(1)确定广播轴:比对两个数组的维度,将形状小的数组的维度(轴)补齐(2)复制元素:顺着补齐的轴,将形状小的数组里的元素复制,最终和形状大的数组的形状一致标量和一维数组单个元素的标量2被广播到数组arr的所有元素上。arr=np.arange(5)print(arr)print(arr+2)广播机制运算步骤(1)确定广播轴:比对两个数组的维度,将形状小的数组的维度(轴)补齐(2)复制元素:顺着补齐的轴,将形状小的数组里的元素复制,最终和形状大的数组的形状一致一维数组和二维数组数组arr的形状是(4,3),而另一个的数组的形状是(3,),沿着轴0,一维数组被广播到数组arr的所有的行上。一维数组和二维数组数组arr的形状是(4,3),而另一个数组形状是(4,),沿着轴1,一维数组却不能广播到数组arr的所有的列上。这时候可以把一维数组转化成矩阵,就可以沿着轴1广播了。广播机制运算规则对两个数组操作时,如果它们的形状:不相容,则不能进行广播机制相容,则可以进行广播机制进行广播机制分两步:1.检查两个数组形状兼容性。即从数组的形状的最后一个元素开始检查(如果数组在某个维度上缺失,用1补齐)它们是否相等(相等条件)是否有一个等于1(有一条件)2.一旦它们形状兼容,确定两个数组的最终一致的形状,其形状在每个维度上的值等于“两个数组的形状在每个维度上的值的最大值”。维度相同形状不同第一步:检查数组a和b形状是否兼容,从两个形状元组(1,3)和(3,1)最后一个元素开始检查。发现它们都满足『有一个等于1』的条件。因此它们形状兼容。第二步:其形状在每个维度上的值等于“两个数组的形状在每个维度上的值的最大值”它们的最终形状为(max(1,3),max(3,1))=(3,3),即a和b被扩展成(3,3)的数组。维度不同第一步:检查数组a和b形状是否兼容,从两个形状元组(5,)和()的最后一个元素开始检查。b的维度缺失,用1补齐得到(1,)a的第一维的元素是5,b的第一维的元素是1,满足“有一个等于1”的条件。形状兼容。第二步:其形状在每个维度上的值等于“两个数组的形状在每个维度上的值的最大值”。它们的最终形状为(max(5,1),)=(5,),即a和b被扩展成(5,)的数组。维度不同第一步:检查数组a和b形状是否兼容,对于数组a和b1,它们形状是(1,2,3)和(3,3),从最后一个元素开始检查。最后一个都是3,兼容倒数第二个是2和3,即不相等,也没有一个是1,不兼容因此a和b1不能进行广播机制。维度不同第一步:检查数组a和b形状是否兼容,对于数组a和b2,它们形状是(1,2,3)和(1,3),从最后一个元素开始检查。最后一个都是3,兼容倒数第二个是1和3,不相等,但有一个是1,兼容倒数第三个是1,后面的维度缺失,补齐为1,因此兼容第二步:其形状在每个维度上的值等于“两个数组的形状在每个维度上的值的最大值”。它们的最终形状为(max((1,)max(2,1),max(3,3))=(1,2,3),即a和b2被扩展成(1,2,3)的数组。维度不同对于数组a和b3,它们形状是(1,2,3)和(2,3),从最后一个元素开始检查最后一个都是3,兼容倒数第二个都是2,兼容因此a和b3可以进行广播机制。维度不同对于数组a和b4,它们形状是(1,2,3)和(2,2,3),从最后一个元素开始检查最后一个都是3,兼容倒数第二个都是2,兼容倒数第三个有一个是1,兼容因此a和b4可以进行广播机制。维度不同对于数组a和b5,它们形状是(1,2,3)和(2,1,3),从最后一个元素开始检查最后一个都是3,兼容倒数第二个有一个是1,兼容倒数第三个有一个是1,兼容因此a和b5可以进行广播机制。维度不同对形状为(2,3,4)的三维数组,能够沿着轴0传播的数组形状是(3,4)或者(1,3,4)。对形状为(2,3,4)的三维数组,能够沿着轴1传播的数组形状是(2,1,4),不能是(2,4)。对形状为(2,3,4)的三维数组,能够沿着轴2传播的数组形状是(2,3,1),不能是(2,3)。广播机制赋值赋值操作时用到的广播机制规则和算术运算时用到的一样。对于标量5和数组arr,它们形状是()和(4,3)。因为标量的维度缺失,需要补齐得到(1,1)。从最后一个元素开始检查最后一个有一个是1,兼容倒数第二个有一个是1,兼容因此5和arr可以进行广播机制。在轴上整合一维数组二维数组三维数组广播机制赋值云计算技术应用省级专业教学资源库谢谢观看Thankyouforwatching云计算技术应用省级专业教学资源库人工智能基础与应用项目三:商品价格折扣系统(任务3-4:实现商品价格折扣案例)CONTENTS目录商品价格折扣系统3.4.1目录CONTENTS1案例背景与目标了解商品价格折扣系统的业务场景2数据准备:创建商品数组使用NumPy创建和初始化数据3随机生成商品数据利用随机数模拟真实商品信息4数据探索与分析索引、切片、统计运算5折扣策略设计条件判断与广播机制6折扣计算与实现数组运算与向量化操作7数据排序与排名sort、argsort、lexsort8数据保存与导出npy、txt、csv格式9案例总结与拓展知识回顾与进阶方向1.案例背景与目标业务场景某电商平台需要对商品进行折扣管理,实现以下功能:●管理多个品类的商品价格●根据价格区间设置不同折扣●支持阶梯折扣和满减策略●对折扣后数据进行分析排序●将处理结果保存为多种格式学习目标✓掌握np.array创建数组与属性操作✓熟练使用随机数生成模拟数据✓灵活运用索引切片提取数据✓使用布尔索引实现条件筛选✓理解广播机制与向量化运算✓掌握sort/argsort排序方法✓学会数组保存为npy/txt/csv2.数据准备:创建商品数组importnumpyasnp#创建商品价格数组(单位:元)prices=np.array([199,89,599,1299,49,299,159,899,69,399])#创建商品名称数组names=np.array(["T恤","水杯","耳机","平板","笔记本","背包","运动鞋","手表","帽子","音箱"])#查看数组基本属性print("形状:",prices.shape,"维度:",prices.ndim,"大小:",prices.size,"类型:",prices.dtype)知识点:np.array()创建数组|shape/ndim/size/dtype属性索引0123456789商品T恤水杯耳机平板笔记本背包运动鞋手表帽子音箱价格19989599129949299159899693992.创建二维商品数组#创建二维数组:每行代表一个商品[价格,库存,成本]products=np.array([[199,50,120],#T恤[89,200,45],#水杯[599,30,350],#耳机[1299,15,800],#平板[49,500,20],#笔记本[299,80,180],#背包])知识点:二维数组创建|reshape()|zeros()/ones()|eye()NumPy常用创建函数函数说明示例np.array()从列表/元组创建数组np.array([1,2,3])np.arange()创建等差序列(类似range)np.arange(0,10,2)np.linspace()创建等间隔样本数组np.linspace(0,1,5)np.zeros/ones()创建全0/全1数组np.zeros((3,4))np.eye()创建单位矩阵np.eye(3)3.随机生成商品数据np.random.seed(42)#设置随机种子,确保结果可复现#生成30个商品的随机数据n=30prices=np.random.randint(10,2000,size=n)#价格:10~2000元stocks=
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 防网络诈骗小学课件
- 服务礼仪课程介绍课件
- 服务理念模板课件
- 法务会议背景课件
- 服务方面的制作课件
- 扶梯注意事项课件
- FTTR行业分析课件
- 伐檀课件教学课件
- 事业单位计算机岗面试2026全真模拟易错题试卷及答案
- 事业单位工程岗2026结构化问答题库及答案
- 2026-2027学年度福建省高一地理期中考试卷
- 2026中国移动校园招聘考试(通信技术)历年参考题库含答案详解
- 现场监理安全隐患巡查手册
- 2026中国钢铁物流加工配送中心转型升级路径探索
- Altium Designer 实操技能考核试题(含详细答案)
- 2026年9月版安全环境职业健康法律法规标准文件清单
- iso9000考试题及答案
- 《组织行为学》课件-第7章 领导
- “练、强、学”题库(全警普测)及答案
- 2025年高尔夫球教练职业能力测试卷:初级技能评估试题
- 12~30月龄儿童健康检查记录表
评论
0/150
提交评论