还剩22页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
或的缩写是中对数组和NumPy NumericalPython NumericPython Python矩阵进行快速数学计算的最基本的软件包之一在处理多维数据时它也非常有用集成、和工具是一件幸事它还提供了许多傅里叶变换和C C++FORTRAN FT线性代数函数为什么使用而不是列表?NumPy人们可能会想到为什么我们应该更喜欢中的数组,而不是我们可以创建具NumPy有相同数据类型的列表如果这句话也引起了你的注意,那么以下原因可能会说服你、数组具有连续的内存分配因此,如果将相同的数组存储为列表,则与
1.1Numpy数组相比将需要更多的空间、它们的使用速度更快,因此比列表更高效
2.
2、他们打交道更方便
3.3与NumPy Pandas构建在之上换句话说,需要才能使其工作所Pandas NumPypandas Numpy以并不是的替代品相反,提供了额外的方法或提供了Pandas Numpypandas在中处理数字和表格数据的更简化的方式Python导入numpy首先,您需要导入库可以通过运行以下命令来导入numpy numpy将导入为numpy np[-36,-47,-52],[-63,-74,-81]]和的矩阵乘法可以通过完成其中将是左侧的第一个矩阵,A BA.dotB A将是右侧的第二个矩阵Barray[[90,120,150],[720,870,1020],[940,1160,1380]]点A.B为了求解线性方程组我们使用Ax=b,npJinalg.solve np.linalg.solveA,barray[-
13.92307692,-
24.69230769,
28.84615385]特征值和特征向量可以使用计算np.linalg.eignp.linalg.eigAarray[
14.0874236,
1.62072127,-
1.70814487],array[[-
0.06599631,-
0.78226966,-
0.14996331],[-
0.59939873,
0.54774477,-
0.81748379],[-
0.7977253,
0.29669824,
0.55608566]]第一行是各种特征值,第二个矩阵表示特征向量矩阵,其中每一列是对应特征值的特征向量一些数学函数我们可以使用得到各种三角函数,如正弦、余弦等:numpyB=np.array[[0-2036][40,501]]55J Jnp.sinBarray[[
0.,-
0.91294525,-
0.99177885],[
0.74511316,-
0.26237485,
0.84147098]]结果是所有元素的矩阵sin为了获得指数,我们使用**B**2array[[0,400,1296],[1600,2500,1]],dtype=int32我们得到的所有元素的平方矩阵B为了获得矩阵的元素是否满足条件,我们需要编写条件例如,要检查的元素是否B超过我们编写25,我们得到一个布尔矩B25array[[False,False,True],[True,True,False]],dtype=bool阵,其中表示相应元素大于表示不满足条件True25,False以类似的方式,和分另返回绝对数、平方根和指数np.absolute^np.sqrt np.exp U的矩阵np.absoluteB np.sqrtB np.expB现在我们考虑形状为的矩阵3*3AA=np.arange1,
10.reshape3,3A array[[l,2,3],[4,5,6],[7,8,9]]为了分别求总和、最小值、最大值、平均值、标准差和方差,我们使用以下命令A.sumA.minA.maxA.mean标准差A.std#方差A.var#A.sumOutput:45A.minOutput:lA.maxOutput:9A.meanOutput
6.666666666666667为了获得最小和最大元素的索引,我们分别使用和argmin argmaxA.argminA.argmaxA.argminOutput:0A.argmaxOutput:8如果我们希望找到每一行或每一列的上述统计信息,那么我们需要指定轴:轴A.sum=0轴A.mean=0轴A.std=0轴A.argmin=0A.sumaxis=0#sum ofeach column,it willmove indownwarddirectionoutput:array[1215,18]A.meanaxis=0,Output:array[
4.,5・
6.]A.stdaxis=0Output:array[
2.44948974,
2.44948974,
2.44948974]A.argminaxis=0Output:array[0,0,0],dtype=int64通过定义计算将向下移动,即它将给出每列的统计数据为了找到每axis=0,行的最小值和最大元素的索引,我们需要向右移动,所以我们写axis=1轴A.min=1轴A.argmax=1A.minaxis=l#min ofeach row,it willmove inrightwisedirectionoutput:array[1,4,7]A.argmaxaxis=1Output:array[2,2,2],dtype=int64为了找到每行的累积和,我们使用cumsum轴A.cumsum=1amay[[1,3,6],[4,9,15],[7,15,24]],dtype=int32创建数组3D还提供创建数组的工具数组可以创建为:Numpy3D3DX=np.array[[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]]X.shapeX.ndim尺寸X包含两个数组,因此形状为元素总数为为了计算沿特定轴的总和,X2D2,2,312我们使用参数,如下所示:axis轴X.sum=0轴X.sum=1轴X.sum=2X.sumaxis=0Output:amay[[8,10,12],[14,16,18]]X.sumaxis=1Output:口array5,7,9],[17,19,21]]X.sumaxis=2Output:array[[6,15],[24,33]]返回每个二维数组对应元素的总和返回每个矩阵中每列元素的总和,axis=0axis=1而返回每个矩阵中每行元素的总和axis=2X.ravelarray[1,2,3,4,5,6,7,8,9,10,11,12]将所有元素写入单个数组中ravel考虑一个数组3DX=np.array[[[1,2,3],[45,6]],[[7,8,9],[10,11,12]]]为了提取第二个矩阵,我们编写:与或相同X[1X[1,:,:]X
[1]array[[78,9],[10,11,12]]请记住,索引从开始,这就是为什么我们编写来提取第二个二维数组Python01要从我们编写的所有行中提取第一个元素与相同X[...,0]#X[:,:,0]array[[1,4],[7,10]]找出满足给定条件的元素的位置a=np.array[8,3,7,0,4,2,5,2]np.wherea4array[0,2,6]定位数组中数组元素大于的位置np.where4使用索引数组进行索引考虑一维数组x=np.arange11,35,2xarray[ll,13,15,17,19,21,23,25,27,29,31,33]我们形成一个一维数组它对的元素进行子集化,如下所示:i,xi=np.array[0,1,5,3,7,9]x[i]arrayCtll,13,21,17,25,29]以类似的方式,我们创建一个数组其索引为子集2D j,j=np.array[
[01]
[62]]Xo555X[j]array[[ll,13],[23,15]]类似地,我们可以将和创建为的索引的二维数组i jxx=np.arange
15.reshape3,5x』第一个暗淡的索引np.array[[0,1],#[2,0]]第二个暗淡的索引j=np.array[[1,1],#[2,0]]为了获取行中的第个索引和列的第个索引,我们编写i j和必须具有相同的形状x[i,j]#i jarray[[1,6],[12,0]]要从第三列中提取第个索引,我们编写ix[i,2]array[[2,7],[12,2]]对于每一行,如果我们想找到第个索引,我们可以这样写:jarray[[[1,1],[2,0]],[[6,6],[7,5]],[[11,11],[12,10]]]固定第行和第个索引,固定第行第个索引,固定第行和第个索引1j2j3j您还可以使用数组索引来分配值x=np.arangeIO xx[[4,5,8,1,2]]=0X array[0,0,0,3,0,0,6,7,0,9]被分配给的第、、、和个索引当索引列表包含重复项时,它将最后一个0x45812值分配给该索引x=np.arangeIO xx[[4,4,2,3]]=[100,200,300,400]xarray[0,1,300,400,200,5,6,7,8,9]请注意,对于第个元素即第个索引,分配的值是而不是注意如果54200,100o对重复索引使用+=运算符,则它仅对重复索引执行一次运算符x=np.arangeW x[”,1,7,7]]+=1X array[0,2,2,3,4,5,6,8,8,9]虽然索引和重复,但它们仅递增一次17使用布尔数组索引我们创建一个数组并将条件存储在中如果条件为真,则结果为否则为2D bTrue,Falseoa=np.arange
12.reshape3,4b=a4barray[[False,False,False,False],[False,True,True,True][True,True,True,True]],dtype=bool请注意,是一个布尔值,其形状与相同“b”“a”要从中选择符合条件的元素,我们编写“a”“b”一个同amay[5,6,7,8,9,10,11]现在变成带有选定元素的一维数组a,此属性在赋值中非常有用a[b]=0aarray[[0,1,2,3],[4,0,0,0],[0,0,0,0]]中大于的所有元素都变为a40正如整数索引中所做的那样,我们可以通过布尔值进行索引设为原始矩阵,和n为布尔值数组以选择行和列x yx=np.arange
15.reshape3,5第一个暗淡选择y=np.array[True,True,False]#第二个暗淡选择z=np.array[True,True,False,True,False]#我们编写它将仅选择为的行x[y,:],v True选择行x[y,:]#相同的事情x[y]#写入将仅选择为的那些列x[:,z]Z True选择列x[:,z]#x[y,]array[[0,1,2,3,4],[5,6,7,8,9]]x[y]#same thingoutput:[5,6,7,8,9]]#selecting rowsOutput:x[:,z]#selecting columnsOutput:array[[0,1,3],[5,6,8],array[[0,1,2,3,4],[10,11,13]]的统计数据Pandas DataFrame让我们创建虚拟数据框进行说明234mydata=pd.DataFrame{xl:np.random.randintlow=l high=100J Jsize=10,x2n:range10}.计算数据框每列的平均值1np.meanmydata.计算数据框每列的中位数2中位数轴np.mydata,=0表示将在每列上运行中值函数表示要在每一行上运行的函数axis=0axis=1这是导入的通用方法,别名为如果未提供别名,那么要从访问函numpy“np”numpy,数,我们将编写为了方便起见,引入了别名以numpy.function“np便我们可以编写下面列出了的一些常用函数-np.function numpy功能任务大批创建数组这就是我数组的维数形状数组的大小行数和列数尺numpy寸数组中元素的总数数据类型数组中元素的类型,即、int64重塑在不改变原始形状的情况下重塑数组调整大小重塑数组也改变原来的character形状排列在数组中创建数字序列商品尺寸每个项目的大小以字节为单位诊断创建对角矩阵虚拟堆栈垂直堆叠栈水平堆叠一维数组使用可以使用numpy np.array创建数组a=np.array[15,25,14,78,96]aprintaaOutput:array[15,25,14,78,96]printaOutput
[1525147896]请注意,中存在方括号缺少方括号会导致错误要打印数组,我们可以使np.array用printao更改数据类型有一个附加的np.array dtype参数,通过该参数可以定义元素是整数、浮点还是复数a.dtypea=np.array[15,25,14,78,96],dtype=floata a.dtype最初的数据类型是修改后变为R int321float
6411.堆叠各种数组让我们考虑个数组和2A BA=np.array[[10,2030][40,5060]]555为了垂直连接它们,我们使用np.vstack#垂直堆叠np.vstackA,Barray[[10,20,30],[40,50,60],[100,200,300],[400,500,600]]为了水平连接它们,我们使用np.hstack0#水平堆叠np.hstackA,Barray[[10,20,30,100,200,300],[40,50,60,400,500,600]]有助于将一维行向量转换为一维列向量newaxisfrom numpyimport newaxisa=np.array[
4.,
1.]b=np.array[
2.,
8.]a[:,newaxis]array[[4・],[I-]]#函数将一维数组作为列堆叠到二维数组中它仅相当于一维数np.column_stack组的hstacknp.column_stacka[:newaxis],b[:,newaxis]5与相同np.hstacka[:,newaxis]b[:,newaxis]#column_stack5np.column_stacka[:,newaxis],b[:,newaxis]Output:array[[
4.,2・],[J
8.]]np.hstacka[:^newaxis]b[r^newaxis]4Output:array[[
4.,
2.],[
8.]]拆分数组考虑一个包含个元素的数组15“z”z=np.arange1,16使用可以分割数组np.hsplit将分割成个数组np.hsplitz,5#a5[array[l,2,3],array[4,5,6],array[7,8,9],array[10,11,12],array[13,14,15]]它将分成个等长的数组“z”5传递个元素后,我们得到2例如hsplitz,3,5[array[l,2,3],array[4,5],array[6,7,8,9,10,11,12,13,14,15]]它在第三个和第五个元素之后分割“z”对于数组,的工作原理如下2D np.hsplitoA=np.arange1,
31.reshape3,10A将拆分为个数组np.hsplitA,5#a5[array[[1,2],[11,12],[21,22]],array[[3,4],[13,14],[23,24]],array[[5,6],[15,16],[25,26]],array[[7,8],[17,18],[27,28]],array[[9,10],[19,20],[29,30]]]在上面的命令中,被分成个形状相同的数组要在第三列和第五列之后进行拆分,A5我们编写np.hsplitA3,5[array[[1,2,3],5[11,12,13],[21,22,23]],array[[4,5],[14,15],[24,25]],array[[6,7,8,9,10],[16,17,18,19,20],[26,27,28,29,30]]]复制考虑一个数组Xx=np.arange1,16我们将指定为然后说是V X,“y X”y=x是y x让我们改变的形状y形状y.=3,5请注意,它改变了的形状X形状X.⑶5创建数据视图让我们将存储为的视图ZXz=x.view是Z XFalse因此不是ZXo改变的形状Z乙形状=5,3创建视图不会改变的形状x.形状x⑶5更改中的元素Zz[
0.0]=1234array[[1234,2,3,4,5],6,7,8,9,10],请注意,中的值也会发生变化:x13,14,15]]因此,显示的变化不会妨碍原始数据,但视图值的变化会影响原始数据创建数据的副本现在让我们创建作为的副本:Z Xz=x.copy注意不是Z X是Z X更改中的值Zz[0,0]=9999中没有进行任何更改XX array[[1234,2,3,4,5],[6,7,8,9,10],[12,13,14,15]]有时可能会给出“设置复制”警告,因为它无法识别新的数据帧或数组作为Python另一个数据帧或数组的子集创建是视图还是副本因此,在这种情况下,用户需要指定它是副本还是视图,否则可能会妨碍结果Python练习Numpy如何从数组中提取偶数?
1.arr=np.array[0,1,2,3,4,5,6,7,8,9]所需输出数组[0,2,4,6,8]显示解决方案arr[arr%2==0]如何找出和元素相同的位置
2.x yx=np.array[5678,34]5335V=np.array[5,3,4,5,2,4]所需输出数组[0,5]显示解决方案np.wherex==y如何标准化值,使其介于和之间
3.01k=np.array[5,34,5,2,4]提示k-mink/maxk-mink显示解决方案kmax,kmin=k.max,k.mink_new=k-kmin/kmax-kmin如何计算数组的百分位数
4.p=np.array[15,10,3,2,5,6,4]显不解决方案np.percentilep,q=[5,95]打印数组中缺失值的数量
5.p=np.array[5,10,np.in,3,2,5,6,np.in]显示解决方案”缺失值的个数print np.isnanp.sum指的是没有小数点的数字表示数字可以在和
2.int32’32,-21474836482147483647之间类似地,表示数字可以在到范围内int16-3276832767指的是带有小数位的数字
3.float64创建数字序列如果您想创建数字序列,那么使用我们可以获得我们的序列要获取np.arange,从到的数字序列,我们运行以下命令2029b=np.arangestart=20,stop=30,step=1b在中,终点始终被排除array[2021,22,23,24,25,26,27,28,29]np.arange,提供了一个步长选项,它定义了两个连续数字之间的差异如果未提供np.arange步骤,则默认采用值1o假设我们要创建一个初始项为、公差为的等差级数被排除在外20230c=np.arange20,30,2#30is excluded,carray[20,22,24,26,28]需要注意的是,在中,参数始终被排除np.arange stop数组中的索引需要注意的是,索引从开始索引的语法如下-Python0数组中的元素从开始到结束但不包括结束,默认步长值
1.x[start:end:step]x为1O数组中的元素从开始到结束但不包括结束
2.x[start:end]x元素从末尾开始
3.x[start:]从开头到结尾的元素但不包括结尾
4.x[:end]如果我们想提取第三个元素,我们将索引写为因为它从开始2,0x=np.arangeIOx
[2]x[2:5]x[::2]x[1::2]XOutput
[0123456789]x
[2]Output:2x[2:5]Output:array[2,3,4]x
[2]Output:array[0,2,4,6,8]x[l::2]Output:array[1^3,5,7,9]请注意,在中,选择从第个索引开始到第个索引不包括的元素x[2:5]25如果我们想要更改从索引开始到索引不包括的所有元素的值,步长为7773,即我们可以这样写123,x[:7:3]=123xarray[123,1,2123,4,5,123,7,8,9]}为了反转给定的数组,我们编写:x=np.arangeIOx[::-1]#reversed xarray[9,8,7,6,5,4,3,2,1,0]请注意,上述命令不会修改原始数组重塑数组要重塑数组,我们可以使用reshape0f=np.arange101,113f.reshape3,4farrayCtlOl,102,103,104,105,106,107,108,109,110,111,112]请注意,不会改变原始数组的形状因此,要修改原始数组,我们可reshape以使用resizef.resize3,4farray[[101,102,103,104],[105,106,107,108],[109,110,111,112]]如果在重塑中将某个维度指定为则只要给定维度是数组中元素总数的倍数,就会-1,自动计算其他维度f.reshape3,-1array[[101,102,103,104],[105,106,107,108],[109,110,111,112]]在上面的代码中,我们只指定了行自动计算其他维度的元素数量,即3Python列4缺失数据缺失的数据由的缩写表示您可以使用命令NaN Nota Numbernp.nanval=np.array[15,10,np.in,3,2,5,6,4]val.sumOut:nan要忽略缺失值,可以使用它返回np.nansumval,45要检查数组是否包含缺失值,可以使用函数isnannp.isnanval数组2D中的数组可以通过以下方式创建numpy2Dg=np.array[10,20,30,40,50,60]#或者g=np.array[[10,20,30],[40,50,60]]G维度、元素总数和形状可以分别通过、和确定ndim sizeshapeg.ndimg.sizeg.shapeg.ndimOutput:2g.sizeOutput:6g.shapeOutput:23创建一些常用矩阵提供了创建一些常用于线性代数的常用矩阵的实用程序numpy要创建行列全零矩阵,我们可以使用24np.zerosnp.zeros2,4array[[0・,0・,0・],[・,
0.,
0.,
0.]]这里还可以指定对于零矩阵,默认数据类型是要将其更改为整dtypeo“float”数,我们编写“dtype=np.int16”np.zeros
[24]dtype=np.int1653array[[0,0,0,0],[0,0,0,0]]dtype=intl6为了获得从到的所有随机数的矩阵,我们编写01np.emptynp.empty2,3array[[
2.16443571e-312,
2.20687562e-312,
2.24931554e-312],[
2.29175545e-312,
2.334195370-312,
2.37663529e-312]]注意每次运行时结果可能会有所不同np.empty为了创建统一矩阵,我们编写我们可以通过以下方式创建一个全为np.ones的矩阵3*3np.ones[3,3]array[[工・,工・],[J J
1.],[1・]]要创建对角矩阵,我们可以编写要创建对角线元素为、、和np.diag141516的对角矩阵,我们编写17np.diag[14,15,16,17]array[[14,0,0,0],[0,15,0,0],[0,0,16,0],[0,0,0,17]]要创建单位矩阵,我们可以使用np,eyenp.eye5,dtype=int”array[[l,0,0,0,0],[0,1,0,0,0],0,1,0,0],[00,0,1,0],,[0,0,0,1]]默认情况下,中的数据类型是因此我们编写将其转换np.eye“float”,dtype=int为整数重塑数组2D要获得展平的数组,我们可以使用1D ravelg=np.array[10,20,30,40,50,60]g.ravelarray[10,20,30,40,50,60]要改变二维数组的形状,我们可以使用写入会自动计算另一个维度,reshapeo-1并且不会修改原始数组返回形状修改后的数组g.reshape3,-1##它不会修改原始数组g.shape2,3与一维数组类似,使用将修改原始数组中的形状resizeg.resize3,2修改原数组g#resizearray[[10,20],[30,40],[50,60]]是时候学习一些矩阵代数了让我们创建一些数组、和它们将用于本节A bB,A=np.array[[2,01],[4,3,8],[7,6,9]]b=np.array[1,101,14]B=np.array[[10,20,30],[40,50,60],[70,80,90]]为了获得转置、迹和逆,我们分别使用和A.transpose np.tracenp.linalg.invA.T transposeA.transpose transposenp.traceA#tracenp.linalg.invA#lnverseA.transpose#transposeOutput:np.traceA#traceOutput:14np.linalg.invA#InverseOutput:array[[2,4,7],array[[
0.53846154,-
0.15384615,
0.07692308],[03,6],[-
0.51282051,-
0.28205128,
0.30769231],[-
0.07692308,
0.30769231,-
0.15384615]][18,9]]请注意,转置不会修改原始数组矩阵加法和减法可以用通常的方式完成:A+BA-BA+Barray[[12,20,31],[44,53,68],[77,86,99]]Output:A-BOutput:array[[-8,-20,-29],。