Python程序設計 課件 第9章 NumPy與數(shù)值計算_第1頁
Python程序設計 課件 第9章 NumPy與數(shù)值計算_第2頁
Python程序設計 課件 第9章 NumPy與數(shù)值計算_第3頁
Python程序設計 課件 第9章 NumPy與數(shù)值計算_第4頁
Python程序設計 課件 第9章 NumPy與數(shù)值計算_第5頁
已閱讀5頁,還剩59頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

第9章NumPy數(shù)值計算數(shù)組的創(chuàng)建與訪問數(shù)組的運算數(shù)組的操作數(shù)組的創(chuàng)建與訪問數(shù)組的運算數(shù)組的操作掌握Numpy的基礎知識學會使用Numpy進行基本的數(shù)學運算掌握Numpy中的廣播(broadcasting)機制學會使用Numpy中的通用函數(shù)(ufuncs)數(shù)組的創(chuàng)建與訪問創(chuàng)建數(shù)組查看數(shù)組屬性訪問數(shù)組修改數(shù)組9.19.1.1創(chuàng)建數(shù)組NumPy是開源的Python科學計算庫,支持多維數(shù)組與矩陣運算。在應用NumPy前,必須先安裝NumPy模塊,使用pip工具,安裝命令為:pipinstallnumpy。使用numpy庫前必須先執(zhí)行下列導入操作:fromnumpyimport*,或者采用importnumpyasnp語句,表示導入numpy庫,并用np代指numpy。9.1.1創(chuàng)建數(shù)組numpy的數(shù)據(jù)結(jié)構(gòu)是N維(多維)的數(shù)組對象,稱為ndarray(或array)對象。數(shù)組對象可以存儲相同類型、以多種形式組織的數(shù)據(jù),組成數(shù)組的各數(shù)據(jù)稱為數(shù)組的元素。numpy提供了兩種基本的對象:ndarray(n-dimensionalarrayobject):存儲單一數(shù)據(jù)類型的多維數(shù)組。ufunc(universalfunctionobject):能夠?qū)?shù)組進行處理的函數(shù)。9.1.1創(chuàng)建數(shù)組numpy提供了多種創(chuàng)建數(shù)組的方法,可以創(chuàng)建多種形式的數(shù)組。一維數(shù)組只有一個維度,二維數(shù)組有兩個維度,從形式上可以看作一個由行和列構(gòu)成的二維表格,每個維度對應一個軸(axis)。12345678910111213141516第1軸第0軸右圖所示是一個二維數(shù)組的示意圖,包含4行4列第1維度(即第0軸)有4行第2維度(即第1軸)有4列。9.1.1創(chuàng)建數(shù)組1.使用array()函數(shù)創(chuàng)建數(shù)組對象例【9-1】利用array()函數(shù)生成numpy數(shù)組。importnumpyasnparr_1=np.array([1,4,7])#列表轉(zhuǎn)換為數(shù)組print(arr_1)print(type(arr_1))#查看數(shù)據(jù)類型arr_2=np.array((1,4,7),dtype=np.float64)#元組轉(zhuǎn)換為數(shù)組print(arr_2)arr_3=np.array(range(6))#range對象轉(zhuǎn)換成數(shù)組print(arr_3)arr_4=np.array([[1,4,7],[2,5,8]])#嵌套列表轉(zhuǎn)換為二維數(shù)組print(arr_4)運行結(jié)果:[147]<class'numpy.ndarray'>[1.4.7.][012345][[147][258]]使用array()函數(shù)可以將Python序列對象或可迭代對象轉(zhuǎn)換為numpy數(shù)組。9.1.1創(chuàng)建數(shù)組2.使用arange()函數(shù)根據(jù)指定數(shù)值范圍創(chuàng)建數(shù)組使用arange()函數(shù)創(chuàng)建基于指定區(qū)間,均勻分布數(shù)值的數(shù)組。語法結(jié)構(gòu)為:

arrange(start,stop,step)用法類似Python的內(nèi)置函數(shù)range(),只是arange()函數(shù)生成的是一系列數(shù)字元素的數(shù)組。9.1.1創(chuàng)建數(shù)組2.使用arange()函數(shù)根據(jù)指定數(shù)值范圍創(chuàng)建數(shù)組例【9-2】使用arange()函數(shù)創(chuàng)建數(shù)組示例。importnumpyasnparr_1=np.arange(6)#創(chuàng)建一個由0-5的整數(shù)組成的一維數(shù)組print(arr_1)arr_2=np.arange(1,10,2)#創(chuàng)建一個元素為1-10之間,步長為2的數(shù)據(jù)組成的一維數(shù)組print(arr_2)運行結(jié)果:[012345][13579]new_arr=arr_1.reshape(2,3)print(new_arr)運行結(jié)果:[[012][345]]用arrange()函數(shù)結(jié)合reshape()方法改變數(shù)組的維度,例如將arr_1改為2行3列的二維數(shù)組9.1.1創(chuàng)建數(shù)組3.創(chuàng)建隨機數(shù)數(shù)組例【9-3】創(chuàng)建隨機數(shù)數(shù)組示例。運行結(jié)果:[[47272524][32421341][3741831]][0.50559110.926484010.596023710.10923207][0.225335951.29729245-1.403894561.36343792-1.67341697]使用numpy.random模塊中的函數(shù)可以創(chuàng)建隨機整數(shù)數(shù)組、隨機小數(shù)數(shù)組、符合正態(tài)分布的隨機數(shù)數(shù)組等。由于是隨機數(shù),所以每次的執(zhí)行結(jié)果都不完全相同。importnumpyasnparr_1=np.random.randint(0,50,size=(3,4))#3行*4列的隨機整數(shù)print(arr_1)arr_2=np.random.rand(4)#[0,1)之間均勻分布的隨機數(shù)print(arr_2)arr_3=np.random.standard_normal(5)#符合標準正態(tài)分布的隨機數(shù)print(arr_3)9.1.1創(chuàng)建數(shù)組3.創(chuàng)建隨機數(shù)數(shù)組例【9-4】seed函數(shù)的使用。運行結(jié)果:00.650374241739591710.650374241739591720.650374241739591700.548813503927324810.41702200470257420.43599490214200376seed()用于指定隨機數(shù)生成時所用算法開始的整數(shù)值。使用相同的seed()值,則每次生成的隨即數(shù)都相同;不設置這個值,每次生成的隨機數(shù)因時間差異而不同;設置的seed()值僅一次有效。importnumpyasnpforiinrange(3):np.random.seed(18)print(i,np.random.random())foriinrange(3):np.random.seed(i)print(i,np.random.random())9.1.1創(chuàng)建數(shù)組4.使用array()函數(shù)創(chuàng)建數(shù)組對象numpy庫還提供了很多創(chuàng)建數(shù)組的其他函數(shù),如下表:函數(shù)功能zeros()創(chuàng)建元素全為0的數(shù)組ones()創(chuàng)建元素全為1的數(shù)組full()創(chuàng)建元素全為某個指定值的數(shù)組linespace()用指定的起始值、終止值和元素個數(shù)創(chuàng)建一個等差數(shù)列l(wèi)ogspace()用指定的起始值、終止值和元素個數(shù)創(chuàng)建一個對數(shù)數(shù)列identity()創(chuàng)建單位矩陣9.1.1創(chuàng)建數(shù)組4.使用array()函數(shù)創(chuàng)建數(shù)組對象例【9-5】創(chuàng)建數(shù)組的其他方式示例。importnumpyasnparr_1=np.zeros(3)print(arr_1)arr_2=np.ones((2,3))print(arr_2)arr_3=np.full((2,3),8)#元素為6的二維數(shù)組print(arr_3)arr_4=np.linspace(0,1,5)print(arr_4)arr_5=np.identity(4)print(arr_5)運行結(jié)果:[0.0.0.][[1.1.1.][1.1.1.]][[888][888]][0.0.250.50.751.][[1.0.0.0.][0.1.0.0.][0.0.1.0.][0.0.0.1.]]9.1.2查看數(shù)組屬性通過NumPy對象的shape、ndim、size、dtype等屬性可以查看數(shù)組的形狀、維度、大小和元素的數(shù)據(jù)類型。arr_1.shapearr_1.ndimarr_1.sizearr_1.dtype返回數(shù)組的維度(1,2……)返回數(shù)組的大小,也就是元素的個數(shù)返回數(shù)組的數(shù)據(jù)類型返回數(shù)組的形狀一維,例(6,)二維,例(2,3)9.1.2查看數(shù)組屬性例【9-6】查看ndarray對象的屬性。運行結(jié)果:數(shù)組一:[012345]形狀為:(6,),維度為:1,大小為:6數(shù)組二:

[[147][258]]形狀為:(2,3),維度為:2,大小為:6importnumpyasnparr_1=np.arange(6)print("數(shù)組一:",arr_1)print(f"形狀為:{arr_1.shape},維度為:{arr_1.ndim},大小為:{arr_1.size}")arr_2=np.array([[1,4,7],[2,5,8]])print("數(shù)組二:\n",arr_2)print(f"形狀為:{arr_2.shape},維度為:{arr_2.ndim},大小為:{arr_2.size}")9.1.3訪問數(shù)組數(shù)組支持通過索引和切片訪問數(shù)組元素。通過索引可以訪問數(shù)組的單個元素,多個元素或一整行元素,NumPy中提供了多種形式的索引,常用的索引方式包括:整數(shù)索引:通過數(shù)組的下標訪問數(shù)組。布爾索引:通過一組布爾值(True或False)對NumPy數(shù)組進行取值操作,返回數(shù)組中索引值與True位置對應的元素。9.1.3訪問數(shù)組1.整數(shù)索引通過整數(shù)索引訪問一維數(shù)組。訪問一維數(shù)組,語法格式:數(shù)組對象名[下標]

可以使用索引、切片、列表作為下標。

索引和切片的使用方法與訪問列表相同,數(shù)組也支持雙向索引。

當正整數(shù)作為下標時,0表示第1個元素,1表示第2個元素,以此類推;當負整數(shù)作為下標時,-1表示最后1個元素,-2表示倒數(shù)第2個元素,以此類推。說明:9.1.3訪問數(shù)組1.整數(shù)索引例【9-7】一維數(shù)組的訪問示例。importnumpyasnparr=np.arange(1,20,2)print(arr)print(arr[3],arr[-1])print(arr[0:3])print(arr[::2])print(arr[[1,2,5]])#索引訪問#切片訪問:獲取前3個元素#從0位置開始,間隔2個步長獲取元素#列表作為下標:獲取下標為1、2、5位置的元素9.1.3訪問數(shù)組1.整數(shù)索引通過整數(shù)索引訪問二維數(shù)組。訪問二維數(shù)組,語法格式一:數(shù)組對象名[行下標]按行訪問,行下標可以是索引、切片或列表形式。說明:9.1.3訪問數(shù)組1.整數(shù)索引通過整數(shù)索引訪問二維數(shù)組。例【9-8】運用行下表訪問二維數(shù)組。importnumpyasnparr_1=np.array(([1,4,7],[2,5,8],[3,6,9]))print("輸出全部元素:\n",arr_1)print("輸出第0行的所有元素:\n",arr_1[0])print("輸出第0~第1行的所有元素:\n",arr_1[0:2])print("輸出第0行和第2行的所有元素:\n",arr_1[[0,2]])#返回所有元素#返回第0行的所有元素#返回第0~第1行的所有元素#返回第0行和第2行的所有元素9.1.3訪問數(shù)組1.整數(shù)索引通過整數(shù)索引訪問二維數(shù)組。訪問二維數(shù)組,語法格式二:數(shù)組對象名[行下標,列下標]通過行和列兩個維度定位元素。行下標和列下標可以是索引、切片或列表形式。

使用“:”可以表示所有行或所有列。說明:9.1.3訪問數(shù)組1.整數(shù)索引通過整數(shù)索引訪問二維數(shù)組。例【9-9】通過行和列兩個維度定位元素。importnumpyasnparr_1=np.array(([1,4,7],[2,5,8],[3,6,9]))print("輸出全部元素:\n",arr_1)print("輸出第0行第2列位置上的元素:\n",arr_1[0,2])print("輸出第0~1行的第1~2列區(qū)域中的元素:\n",arr_1[0:2,1:3])print("輸出第0行的第1~2列區(qū)域中的元素:\n",arr_1[0,1:3])print("輸出第0行和第2行的第1~2列區(qū)域中的元素:\n",arr_1[[0,2],1:3])print("輸出所有行的第1-2列區(qū)域中的元素:\n",arr_1[:,1:3])9.1.3訪問數(shù)組2.布爾型索引訪問語法格式:數(shù)組對象名[布爾型索引]布爾型索引通過一組布爾值(True或False)對NumPy數(shù)組進行取值操作,返回數(shù)

組中索引值與True位置對應的元素。

通常利用數(shù)組的條件運算(也稱為布爾運算)得到一組布爾值,再通過這組布爾值

從數(shù)組中選出滿足條件的元素。說明:9.1.3訪問數(shù)組2.布爾型索引訪問通過整數(shù)索引訪問二維數(shù)組。例【9-10】布爾型索引訪問示例。假設現(xiàn)在有一組存儲了學生姓名的數(shù)組,以及一組存儲了學生各科成績的數(shù)組,存儲學生成績的數(shù)組中,每一行成績對應的是一個學生的成績。如果我們想篩選某個學生對應的成績,可以通過比較運算符,先產(chǎn)生一個布爾型數(shù)組,然后利用布爾型數(shù)組作為索引,返回布爾值True對應位置的數(shù)據(jù)。9.1.3訪問數(shù)組2.布爾型索引訪問例【9-10】代碼示例importnumpyasnpstudent_name=np.array(['申凡','石英','史伯','王駿'])student_score=np.array([[75,98,56],[79,86,78],[76,89,90],[84,87,76]])student_name=='王駿'print(student_score[student_score>85])print(student_score[student_name=='王駿'])#存儲學生姓名的數(shù)組#存儲學生成績的數(shù)組#對student_name和字符串“王駿”通過運算符產(chǎn)生一個布爾型數(shù)組#將布爾數(shù)組作為索引應用于存儲成績的數(shù)組#student_score,返回的數(shù)據(jù)是True值對應的行9.1.4修改數(shù)組1.修改數(shù)組元素通過為數(shù)組元素重新賦值也可以修改數(shù)組元素,但賦值操作屬于“原地修改”,會改變原來的數(shù)組。注意對于已經(jīng)建立的數(shù)組,可以修改數(shù)組元素,也可以改變數(shù)組的形狀。使用下列NumPy函數(shù)可以添加或刪除數(shù)組元素。這些操作會返回一個新的數(shù)組,原數(shù)組不受影響。append():追加一個元素或一組元素。insert():在指定位置插入一個元素或一組元素。delete():刪除指定位置上的一個元素。9.1.4修改數(shù)組1.修改數(shù)組元素例【9-11】運用方法實現(xiàn)數(shù)組元素的增、刪、改。importnumpyasnparr_1=np.arange(6)print(arr_1)arr_2=np.append(arr_1,6)print(arr_2)arr_3=np.append(arr_1,[9,10])print(arr_3)arr_4=np.insert(arr_1,1,8)print(arr_4)arr_5=np.delete(arr_1,1)print(arr_5)arr_1[3]=8print(arr_1)#追加一個元素,返回一個新的數(shù)組#追加一組元素#

在第1個下標位置處插入元素8#刪除下標為1的元素#修改元素值9.1.4修改數(shù)組2.查詢數(shù)組元素數(shù)組的查詢既可以使用索引和切片方法來獲取指定范圍的數(shù)組或數(shù)組元素,還可以通過where函數(shù)查詢符合條件的數(shù)組或數(shù)組元素。where函數(shù)的語法如下:numpy.where(condition,x,y)滿足條件(參數(shù)condition),則輸出參數(shù)x;不滿足條件則輸出參數(shù)y。如果不指定參數(shù)X和y,則輸出滿足條件的數(shù)組元素。功能:(為一個布爾數(shù)組)(x和y可以是標量也可以是數(shù)組)9.1.4修改數(shù)組2.查詢數(shù)組元素例【9-12】運用方法實現(xiàn)數(shù)組元素的查詢。importnumpyasnparr_1=np.arange(6)print(arr_1)arr_6=arr_1[np.where(arr_1>=5)]print(arr_6)#找出大于5的數(shù)組元素運行結(jié)果:[012345][85]9.1.4修改數(shù)組3.數(shù)組的重塑數(shù)組重塑實際是更改數(shù)組的形狀。使用數(shù)組對象的shape屬性和以下方法:reshape():用于改變數(shù)組的形狀。flatten():數(shù)據(jù)扁平為一維數(shù)組,返回拷貝(copy)ravel():數(shù)據(jù)為一維數(shù)組,返回視圖(view)147258124578修改數(shù)組的shape屬性會直接改變原數(shù)組的形狀,這種操作稱為原地修改。reshape()、flatten()、ravel()等方法不會影響原數(shù)組,而是返回一個改變形狀的新數(shù)組。注意9.1.4修改數(shù)組3.數(shù)組的重塑例【9-13】數(shù)組重塑示例。importnumpyasnparr=np.arange(6)print("創(chuàng)建的一維數(shù)組為:\n",arr)arr2d=arr.reshape(2,3)print("由一維變二維數(shù)組為:\n",arr2d)arr2d=np.array([[1,4,7],[2,5,8]])arr2d_new=arr2d.reshape(3,2)print("改變數(shù)組維度為:\n",arr2d_new)arr2d_r=arr2d.ravel()print("數(shù)據(jù)散開為:\n",arr2d_r)運行結(jié)果:創(chuàng)建的一維數(shù)組為:[012345]由一維變二維數(shù)組為:

[[012][345]]改變數(shù)組維度為:

[[14][72][58]]數(shù)據(jù)散開為:

[147258]數(shù)組的運算

數(shù)組的轉(zhuǎn)置數(shù)組的算術運算數(shù)組的布爾運算數(shù)組的點積運算數(shù)組的統(tǒng)計運算9.29.2.1數(shù)組的轉(zhuǎn)置無論形狀是否相同,數(shù)組之間都可以執(zhí)行算術運算,與Python的列表不同,數(shù)組在參與算術運算時,無需遍歷每個元素,便可以執(zhí)行批量運算,效率更高。創(chuàng)建數(shù)組后,可進行:算術運算布爾運算點積運算統(tǒng)計運算9.2.1數(shù)組的轉(zhuǎn)置數(shù)組的轉(zhuǎn)置是指交換數(shù)組的行和列,可以使用數(shù)組對象的T操作完成轉(zhuǎn)置。例如:2行3列轉(zhuǎn)置成3行2列。1472581245789.2.1數(shù)組的轉(zhuǎn)置例【9-14】importnumpyasnparr_1=np.array([[1,4,7],[2,5,8]])print("輸出原矩陣:\n",arr_1)arr_2=arr_1.Tprint("輸出轉(zhuǎn)置后的矩陣:\n",arr_2)arr_3=np.array([1,2,3])print("一維數(shù)組轉(zhuǎn)置后矩陣:\n",arr_3.T)print("輸出原一維數(shù)組矩陣:\n",arr_3)矩陣的轉(zhuǎn)置的示例。運行結(jié)果:輸出原矩陣:

[[147][258]]輸出轉(zhuǎn)置后的矩陣:

[[12][45][78]]一維數(shù)組轉(zhuǎn)置后矩陣:

[123]輸出原一維數(shù)組矩陣:

[123]9.2.2數(shù)組的算術運算1.數(shù)組與標量的算術運算標量就是一個數(shù)值,既可以使用算術運算符又可以使用相應功能的數(shù)學函數(shù)對數(shù)組和標量進行算術運算。算術運算算術運算符數(shù)學函數(shù)加+add減-subtract乘*multiply除/divide整除//divmod(整除得到商和余數(shù))取余%remainder乘方**power開方

無sqrt9.2.2數(shù)組的算術運算1.數(shù)組與標量的算術運算例【9-15】矩陣的加、減、乘和除運算。importnumpyasnparr_1=np.array((1,2,3,4,5))print("數(shù)組:\n",arr_1)print("數(shù)組與2相加的結(jié)果:\n",arr_1+2)print("數(shù)組與2相除的結(jié)果:\n",arr_1/2)print("數(shù)組與2次冪的結(jié)果:\n",arr_1**2)print("數(shù)組與2相乘的結(jié)果:\n",np.multiply(arr_1,2))

print("數(shù)組與2整除得到商和余數(shù)的結(jié)果:\n",np.divmod(arr_1,2))#數(shù)組arr_1每個元素+2#數(shù)組arr_1每個元素/2#數(shù)組arr_1每個元素的2次方#數(shù)組arr_1每個元素*2#數(shù)組arr_1每個元素與2整除#得到商和余數(shù)9.2.2數(shù)組的算術運算2.形狀相同的數(shù)組間運算當數(shù)組與數(shù)組進行算術運算時,如果兩個數(shù)組的形狀相同,新數(shù)組是每個元素值為兩個數(shù)組中相同位置上的元素進行算術運算后的結(jié)果。形狀相同的數(shù)組間運算被稱為數(shù)組的矢量化運算。例如兩個形狀均為(2,3),即2行3列的數(shù)組data1和data2,3692561231234812379+=9.2.2數(shù)組的算術運算2.形狀相同的數(shù)組間運算例【9-16】形狀相同的數(shù)組之間的算術運算。importnumpyasnpdata1=np.array([[3,6,9],[2,5,6]])data2=np.array([[1,2,3],[1,2,3]])print('兩個數(shù)組相加的結(jié)果:\n',data1+data2)print('兩個數(shù)組相乘的結(jié)果:\n',data1*data2)print('兩個數(shù)組相減的結(jié)果:\n',data1-data2)print('兩個數(shù)組相除的結(jié)果:\n',data1/data2)print('兩個數(shù)組冪運算的結(jié)果:\n',data1**data2)運行結(jié)果:兩個數(shù)組相加的結(jié)果:[[4812][379]]兩個數(shù)組相乘的結(jié)果:[[31227][21018]]兩個數(shù)組相減的結(jié)果:[[246][133]]兩個數(shù)組相除的結(jié)果:[[3.3.3.][2.2.52.]]兩個數(shù)組冪運算的結(jié)果:[[336729][225216]]9.2.2數(shù)組的算術運算3.形狀不同的數(shù)組間運算當形狀不相等的數(shù)組執(zhí)行算術運算的時候,就會觸發(fā)廣播機制,該機制會對形狀相對較小的數(shù)組進行擴展,以匹配與之計算的形狀較大的數(shù)組,使兩個數(shù)組的shape屬性值一樣,這樣就可以轉(zhuǎn)換為形狀相同的數(shù)組之間的運算,即可進行矢量化運算。廣播機制實現(xiàn)了對兩個或兩個以上數(shù)組的運算,但并不適用于所有數(shù)組間運算,它要求兩個數(shù)組滿足規(guī)則。注意9.2.2數(shù)組的算術運算3.形狀不同的數(shù)組間運算例【9-17】形狀不相等的數(shù)組間運算。importnumpyasnparr1=np.array([[0],[1],[2],[3]])print('數(shù)組arr1的形狀:\n',arr1.shape)arr2=np.array([1,2,3])print('數(shù)組arr2的形狀:\n',arr2.shape)print('arr1與arr2相加的結(jié)果為:\n',arr1+arr2)#數(shù)組arr1的形狀(4,1),2維數(shù)組,每個#數(shù)組1個元素,即4行1列#數(shù)組arr2的形狀(3,),1維數(shù)組,每個數(shù)#組3個元素,即1行3列#數(shù)組arr1、arr2擴展成相同形狀(4,3),#再進行相加運行結(jié)果:[0.462810780.695931330.010585590.845837930.76860401][FalseTrueFalseTrueTrue][0.695931330.845837930.76860401]9.2.3數(shù)組的布爾運算1.數(shù)組和標量的布爾運算布爾運算是指運算結(jié)果為布爾型對象(True或False)的操作,包括關系運算和邏輯運算。布爾運算的結(jié)果可用作訪問數(shù)組元素的條件。例【9-18】數(shù)組和標量的布爾運算示例。importnumpyasnparr_1=np.random.rand(5)print(arr_1)print(arr_1>0.6)print(arr_1[(arr_1>0.6)])生成5個隨機數(shù)數(shù)組大于0.6的元素為真值返回大于0.6的元素運行結(jié)果:[[FalseTrueFalse][FalseFalseTrue]][67]9.2.3數(shù)組的布爾運算2.數(shù)組和數(shù)組的布爾運算當數(shù)組和數(shù)組進行布爾運算時,就是將兩個數(shù)組對應位置上的元素進行比較。當數(shù)組形狀不同時,如果符合廣播要求,則進行廣播,否則會報錯。例【9-19】數(shù)組和數(shù)組的布爾運算示例。importnumpyasnparr_1=np.array([[3,6,9],[2,5,7]])arr_2=np.array([[1,8,7],[2,5,8]])print(arr_1<arr_2)print(arr_1[arr_1<arr_2])arr_1小于arr_2的元素位置返回True返回arr_1數(shù)組中小于arr_2的元素9.2.4數(shù)組的點積運算進行點積運算時,如果兩個數(shù)組是長度相同的一維數(shù)組,則運算結(jié)果為兩個數(shù)組對應位置上的元素乘積之和,即向量內(nèi)積;如果兩個數(shù)組是形狀分別為(m,k)和(k,n)的二維數(shù)組,則表示矩陣相乘,運算結(jié)果是形狀為(m,n)的二維數(shù)組,這種情況與NumPy的matmul()函數(shù)計算結(jié)果等價。12345612345622284964×=實現(xiàn)代碼,見【例9-20】9.2.4數(shù)組的點積運算例【9-20】importnumpyasnparr_x=np.array([[1,2,3],[4,5,6]])arr_y=np.array([[1,2],[3,4],[5,6]])result=arr_x.dot(arr_y)#等價于np.dot(arr_x,arr_y)print("輸出兩個矩陣的點積:\n",result)矩陣乘法的dot()方法,求數(shù)組的點積。運行結(jié)果:輸出兩個矩陣的積:

[[2228][4964]]9.2.5數(shù)組的統(tǒng)計運算NumPy中定義了多個數(shù)學統(tǒng)計函數(shù),可以對整個數(shù)組或某個軸向的數(shù)據(jù)進行統(tǒng)計計算。名稱功能名稱功能sum()計算和Prod()計算乘積min()計算最小值percentitle()計算百分位數(shù)max()計算最大值argmax()返回最大值的索引mean()計算平均值argmin()返回最小值的索引std()計算標準差cumsum()計算累計和var()計算方差cumprod()計算累計乘積9.2.5數(shù)組的統(tǒng)計運算例【9-21】importnumpyasnparr=np.arange(10)print("輸出數(shù)組元素:",arr)print("所有數(shù)組元素求和:",arr.sum())print("所有數(shù)組元素求平均值:",arr.mean())print("所有數(shù)組元素求最小值:",arr.min())print("所有數(shù)組元素求最大值:",arr.max())print("所有數(shù)組元素求最小值的索引:",arr.argmin())print("所有數(shù)組元素求最大值的索引:",arr.argmax())print("所有數(shù)組元素求累計和:",arr.cumsum())print("所有數(shù)組元素求累計積:",arr.cumprod())數(shù)組統(tǒng)計函數(shù)的應用。運行結(jié)果:輸出數(shù)組元素:[0123456789]所有數(shù)組元素求和:45所有數(shù)組元素求平均值:4.5所有數(shù)組元素求最小值:0所有數(shù)組元素求最大值:9所有數(shù)組元素求最小值的索引:0所有數(shù)組元素求最大值的索引:9所有數(shù)組元素求累計和:[0136101521283645]所有數(shù)組元素求累計積:[0000000000]9.2.5數(shù)組的統(tǒng)計運算運行結(jié)果:輸出原矩陣:

[[147][258]]統(tǒng)計各列的均值:

[1.54.57.5]統(tǒng)計各行的均值:

[4.5.]對于多維數(shù)組,可以選擇在不同的軸向進行統(tǒng)計運算。對二維數(shù)組進行統(tǒng)計運算時,如果不指定軸向,則默認是對整個數(shù)組進行統(tǒng)計;如果指定axis=0,則表示按第1個維度統(tǒng)計;如果指定axis=1,則表示按第2個維度統(tǒng)計。例【9-19】數(shù)組和數(shù)組的布爾運算示例。importnumpyasnparr_1=np.array([[1,4,7],[2,5,8]])print("輸出原矩陣:\n",arr_1)print("統(tǒng)計各列的均值:\n",np.mean(arr_1,axis=0))print("統(tǒng)計各行的均值:\n",np.mean(arr_1,axis=1))數(shù)組的操作數(shù)組的排序數(shù)組的合并9.39.3.1數(shù)組的排序當’使用NumPy對象的sort()方法或NumPy中的sort()函數(shù)可以對數(shù)組進行排序。前者是原地排序,會改變原數(shù)組中元素的位置;后者會返回新的排序結(jié)果,不會影響原數(shù)組中元素的位置。sort()函數(shù):最常用的排序方法,函數(shù)調(diào)用改變原始數(shù)組。argsort()函數(shù):返回升序排序之后的數(shù)組值為從小到大的索引值。lexsort()函數(shù):用于對多個序列進行排序。9.3.1數(shù)組的排序1.sort()函數(shù)sort()函數(shù)是最常用的排序方法,函數(shù)調(diào)用改變原始數(shù)組。語法如下:sort(a,axis,kind,order)a:要排序的數(shù)組axis:使得sort函數(shù)可以沿著指定軸對數(shù)據(jù)集進行排序。axis=1為沿橫軸排序;axis=0為沿縱橫排序;axis=None,將數(shù)組平坦化之后進行排序。kind:排序算法,默認為quicksortorder:如果數(shù)組包含字段,則是要排序的字段。參數(shù)說明:9.3.1數(shù)組的排序1.sort()函數(shù)運行結(jié)果:輸出原數(shù)組:

[[417][396][852]]輸出排序后的數(shù)組:

[[147][369][258]]沿著編號為0的軸對元素排序:

[[147][258][369]]例【9-23】importnumpyasnparr=np.array([[4,1,7],[3,9,6],[8,5,2]])arr_copy=arrprint("輸出原數(shù)組:\n",arr)arr.sort()print("輸出排序后的數(shù)組:\n",arr)arr_copy.sort(0)print("沿著編號為0的軸對元素排序:\n",arr_copy)利用sort()方法對數(shù)組排序。運行結(jié)果:升序排序后的索引值:[9632058417]排序后的順序重構(gòu)原數(shù)組:[0123456789]9.3.1數(shù)組的排序2.argsort()函數(shù)使用argsort()函數(shù)對數(shù)組進行排序,返回升序排序之后的數(shù)組值為從小到大的索引值。例【9-24】argsort()函數(shù)的應用示例。importnumpyasnpx=np.array([4,8,3,2,7,5,1,9,6,0])print('升序排序后的索引值:')y=np.argsort(x)print(y)print('排序后的順序重構(gòu)原數(shù)組:')print(x[y])9.3.1數(shù)組的排序2.lexsort()函數(shù)用于對多個序列進行排序??梢园阉斪魇菍﹄娮颖砀襁M行排序,每一列代表一個列,排序時會優(yōu)先照顧靠后的列。例【9-25】使用argsort()函數(shù)和lexsort()函數(shù)進行排序。importnumpyasnparr=np.array([7,9,5,2,9,4,3,1,4,3])print('原數(shù)組:',arr)print('排序后各數(shù)據(jù)的索引:',arr.argsort())print('顯示較大的5個數(shù):',arr[arr.argsort()][-5:])a=[1,5,7,2,3,-2,4]b=[9,5,2,0,6,8,7]ind=np.lexsort((b,a))print('ind:',ind)tmp=[(a[i],b[i])foriinind]print('tmp:',tmp)運行結(jié)果:原數(shù)組:[7952943143]排序后各數(shù)據(jù)的索引:[7369582014]顯示較大的5個數(shù):[45799]ind:[5034612]tmp:[(-2,8),(1,9),(2,0),(3,6),(4,7),(5

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論