Python科學(xué)計算與數(shù)據(jù)處理課件_第1頁
Python科學(xué)計算與數(shù)據(jù)處理課件_第2頁
Python科學(xué)計算與數(shù)據(jù)處理課件_第3頁
Python科學(xué)計算與數(shù)據(jù)處理課件_第4頁
Python科學(xué)計算與數(shù)據(jù)處理課件_第5頁
已閱讀5頁,還剩201頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

NumPy——快速處理數(shù)據(jù)NumPy——快速處理數(shù)據(jù)NumPy—ndarray對象NumPy—ndarray對象目錄NumPy的導(dǎo)入創(chuàng)建數(shù)組存取元素多維數(shù)組結(jié)構(gòu)數(shù)組目錄NumPy的導(dǎo)入NumPy的導(dǎo)入標(biāo)準(zhǔn)的Python中用列表(list)保存一組值,可以當(dāng)作數(shù)組使用。但由于列表的元素可以是任何對象,因此列表中保存的是對象的指針。對于數(shù)值運算來說,這種結(jié)構(gòu)顯然比較浪費內(nèi)存和CPU計算Python提供了array模塊,它和列表不同,能直接保存數(shù)值,但是由于它不支持多維數(shù)組,也沒有各種運算函數(shù),因此也不適合做數(shù)值運算。NumPy的導(dǎo)入標(biāo)準(zhǔn)的Python中用列表(list)保存NumPy的導(dǎo)入NumPy的誕生彌補了這些不足,NumPy提供了兩種基本的對象:ndarray(n-dimensionalarrayobject)和ufunc(universalfunctionobject)。ndarray(下文統(tǒng)一稱之為數(shù)組)是存儲單一數(shù)據(jù)類型的多維數(shù)組,而ufunc則是能夠?qū)?shù)組進行處理的函數(shù)。函數(shù)庫的導(dǎo)入importnumpyasnpNumPy的導(dǎo)入NumPy的誕生彌補了這些不足,NumPy創(chuàng)建數(shù)組在IPython中輸入函數(shù)名并添加一個“?”符號,就可以顯示文檔內(nèi)容。例如,輸入“np.array?”可以通過給array函數(shù)傳遞Python的序列對象創(chuàng)建數(shù)組,如果傳遞的是多層嵌套的序列,將創(chuàng)建多維數(shù)組(下例中的變量c):創(chuàng)建數(shù)組在IPython中輸入函數(shù)名并添創(chuàng)建數(shù)組>>>a=np.array([1,2,3,4])>>>b=np.array((5,6,7,8))>>>c=np.array([[1,2,3,4],[4,5,6,7],[7,8,9,10]])>>>barray([5,6,7,8])>>>carray([[1,2,3,4],[4,5,6,7],[7,8,9,10]])>>>c.dtype#數(shù)組的元素類型可以通過dtype屬性獲得dtype('int32')創(chuàng)建數(shù)組>>>a=np.array([1,2,3,創(chuàng)建數(shù)組數(shù)組的大小可以通過其shape屬性獲得:可以通過修改數(shù)組的shape屬性,在保持數(shù)組元素個數(shù)不變的情況下,改變數(shù)組每個軸的長度。>>>a.shape#一維數(shù)組(4,)>>>c.shape#二維數(shù)組其中第0軸的長度為3,第1軸的長度為4。(3,4)>>>c.shape=4,3#注意從(3,4)改為(4,3)并不是對數(shù)組進行轉(zhuǎn)置,而只是改變每個軸的大小,數(shù)組元素在內(nèi)存中的位置并沒有改變:>>>carray([[1,2,3],[4,4,5],[6,7,7],[8,9,10]])創(chuàng)建數(shù)組數(shù)組的大小可以通過其shape屬性獲得:>創(chuàng)建數(shù)組>>>d=a.reshape((2,2))#使用數(shù)組的reshape方法,可以創(chuàng)建一個改變了尺寸的新數(shù)組,原數(shù)組的shape保持不變。>>>darray([[1,2],[3,4]])>>>aarray([1,2,3,4])>>>c.shape=2,-1#當(dāng)某個軸的元素為-1時,將根據(jù)數(shù)組元素的個數(shù)自動計算此軸的長度,因此下面的程序?qū)?shù)組c的shape改為了(2,6)。>>>carray([[1,2,3,4,4,5],[6,7,7,8,9,10]])創(chuàng)建數(shù)組>>>d=a.reshape((2,2))創(chuàng)建數(shù)組數(shù)組a和d其實共享數(shù)據(jù)存儲內(nèi)存區(qū)域,因此修改其中任意一個數(shù)組的元素都會同時修改另外一個數(shù)組。>>>a[1]=100#將數(shù)組a的第一個元素改為100>>>d#注意數(shù)組d中的2也被改變了array([[1,100],[3,4]])創(chuàng)建數(shù)組數(shù)組a和d其實共享數(shù)據(jù)存儲內(nèi)存區(qū)創(chuàng)建數(shù)組

數(shù)組的元素類型可以通過dtype屬性獲得??梢酝ㄟ^dtype參數(shù)在創(chuàng)建時指定元素類型:>>>np.array([[1,2,3,4],[4,5,6,7],[7,8,9,10]],dtype=np.float)array([[1.,2.,3.,4.],[4.,5.,6.,7.],[7.,8.,9.,10.]])>>>np.array([[1,2,3,4],[4,5,6,7],[7,8,9,10]],dtype=plex)array([[1.+0.j,2.+0.j,3.+0.j,4.+0.j],

[4.+0.j,5.+0.j,6.+0.j,7.+0.j],

[7.+0.j,8.+0.j,9.+0.j,10.+0.j]])創(chuàng)建數(shù)組數(shù)組的元素類型可以通過dtype屬性創(chuàng)建數(shù)組上面的例子都是先創(chuàng)建一個Python序列,然后通過array函數(shù)將其轉(zhuǎn)換為數(shù)組,這樣做顯然效率不高。因此NumPy提供了很多專門用來創(chuàng)建數(shù)組的函數(shù)。?arange函數(shù)類似于python的range函數(shù),通過指定開始值、終值和步長來創(chuàng)建一維數(shù)組,注意數(shù)組不包括終值:>>>np.arange(0,1,0.1)array([0.,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9])創(chuàng)建數(shù)組上面的例子都是先創(chuàng)建一個Pyth創(chuàng)建數(shù)組?linspace函數(shù)通過指定開始值、終值和元素個數(shù)來創(chuàng)建一維數(shù)組,可以通過endpoint關(guān)鍵字指定是否包括終值,缺省設(shè)置是包括終值:>>>np.linspace(0,1,10)#步長為1/9array([0.,0.11111111,0.22222222,0.33333333,0.44444444,0.55555556,0.66666667,0.77777778,0.88888889,1.])>>>np.linspace(0,1,10,endpoint=False)#步長為1/10array([0.,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9])創(chuàng)建數(shù)組?linspace函數(shù)通過指定開始值創(chuàng)建數(shù)組?logspace函數(shù)和linspace類似,不過它創(chuàng)建等比數(shù)列,下面的例子產(chǎn)生1(10^0)到100(10^2)、有20個元素的等比數(shù)列:>>>np.logspace(0,2,20)array([1.,1.27427499,1.62377674,2.06913808,2.6366509,3.35981829,4.2813324,5.45559478,6.95192796,8.8586679,11.28837892,14.38449888,18.32980711,23.35721469,29.76351442,37.92690191,48.32930239,61.58482111,78.47599704,100.])創(chuàng)建數(shù)組?logspace函數(shù)和lin創(chuàng)建數(shù)組zeros()、ones()、empty()可以創(chuàng)建指定形狀和類型的數(shù)組。此外,zeros_like()、ones_like()、empty_like()等函數(shù)可創(chuàng)建與參數(shù)數(shù)組的形狀及類型相同的數(shù)組。因此,“zeros_like(a)”和“zeros(a.shape,a.dtype)”的效果相同。>>>np.empty((2,3),)#只分配內(nèi)存,不對其進行初始化array([[32571594,32635312,505219724],[45001384,1852386928,665972]])????>>>np.zeros(4,np.float)#元素類型默認為np.float,因此這里可以省略array([0.,0.,0.,0.])創(chuàng)建數(shù)組zeros()、ones()、e創(chuàng)建數(shù)組此外,使用frombuffer,fromstring,fromfile,fromfunction等函數(shù)可以從字節(jié)序列、文件創(chuàng)建數(shù)組,下面以fromfunction為例:np.fromfunction?fromfunction函數(shù)的第一個參數(shù)為計算每個數(shù)組元素的函數(shù),第二個參數(shù)為數(shù)組的大小(shape)。>>>deffunc(i):...returni%4+1...>>>np.fromfunction(func,(10,))array([1.,2.,3.,4.,1.,2.,3.,4.,1.,2.])創(chuàng)建數(shù)組此外,使用frombuffer,f創(chuàng)建數(shù)組

下面的例子創(chuàng)建一個二維數(shù)組表示九九乘法表,輸出的數(shù)組a中的每個元素a[i,j]都等于func2(i,j):>>>deffunc2(i,j):...return(i+1)*(j+1)...>>>a=np.fromfunction(func2,(9,9))>>>aarray([[1.,2.,3.,4.,5.,6.,7.,8.,9.],[2.,4.,6.,8.,10.,12.,14.,16.,18.],[3.,6.,9.,12.,15.,18.,21.,24.,27.],[4.,8.,12.,16.,20.,24.,28.,32.,36.],[5.,10.,15.,20.,25.,30.,35.,40.,45.],[6.,12.,18.,24.,30.,36.,42.,48.,54.],[7.,14.,21.,28.,35.,42.,49.,56.,63.],[8.,16.,24.,32.,40.,48.,56.,64.,72.],[9.,18.,27.,36.,45.,54.,63.,72.,81.]])創(chuàng)建數(shù)組下面的例子創(chuàng)建一個二維數(shù)組表示九九乘存取元素數(shù)組元素的存取方法和Python的標(biāo)準(zhǔn)方法相同:>>>a=np.arange(10)>>>a[5]#用整數(shù)作為下標(biāo)可以獲取數(shù)組中的某個元素5>>>a[3:5]#用范圍作為下標(biāo)獲取數(shù)組的一個切片,包括a[3]不包括a[5]array([3,4])>>>a[:5]#省略開始下標(biāo),表示從a[0]開始array([0,1,2,3,4])>>>a[:-1]#下標(biāo)可以使用負數(shù),表示從數(shù)組后往前數(shù)array([0,1,2,3,4,5,6,7,8])>>>a[2:4]=100,101#下標(biāo)還可以用來修改元素的值>>>aarray([0,1,100,101,4,5,6,7,8,9])>>>a[1:-1:2]#范圍中的第三個參數(shù)表示步長,2表示隔一個元素取一個元素存取元素數(shù)組元素的存取方法和Python的標(biāo)準(zhǔn)方法相存取元素

array([1,101,5,7])>>>a[::-1]#省略范圍的開始下標(biāo)和結(jié)束下標(biāo),步長為-1,整個數(shù)組頭尾顛倒array([9,8,7,6,5,4,101,100,1,0])>>>a[5:1:-2]#步長為負數(shù)時,開始下標(biāo)必須大于結(jié)束下標(biāo)array([5,101])存取元素array([1,101,5,7])存取元素和Python的列表序列不同,通過下標(biāo)范圍獲取的新的數(shù)組是原始數(shù)組的一個視圖。它與原始數(shù)組共享同一塊數(shù)據(jù)空間:>>>b=a[3:7]#通過下標(biāo)范圍產(chǎn)生一個新的數(shù)組b,b和a共享同一塊數(shù)據(jù)空間>>>barray([101,4,5,6])>>>b[2]=-10#將b的第2個元素修改為-10>>>barray([101,4,-10,6])>>>a#a的第5個元素也被修改為10array([0,1,100,101,4,-10,6,7,8,9])存取元素和Python的列表序列不同,通過下標(biāo)范圍獲取的新的存取元素除了使用下標(biāo)范圍存取元素之外,NumPy還提供了兩種存取元素的高級方法。使用整數(shù)序列當(dāng)使用整數(shù)序列對數(shù)組元素進行存取時,將使用整數(shù)序列中的每個元素作為下標(biāo),整數(shù)序列可以是列表或者數(shù)組。使用整數(shù)序列作為下標(biāo)獲得的數(shù)組不和原始數(shù)組共享數(shù)據(jù)空間。>>>x=np.arange(10,1,-1)>>>xarray([10,9,8,7,6,5,4,3,2])存取元素除了使用下標(biāo)范圍存取元素之外,N存取元素

>>>x[[3,3,1,8]]#獲取x中的下標(biāo)為3,3,1,8的4個元素,組成一個新的數(shù)組array([7,7,9,2])>>>b=x[np.array([3,3,-3,8])]#下標(biāo)可以是負數(shù)>>>b[2]=100>>>barray([7,7,100,2])>>>x#由于b和x不共享數(shù)據(jù)空間,因此x中的值并沒有改變array([10,9,8,7,6,5,4,3,2])>>>x[[3,5,1]]=-1,-2,-3#整數(shù)序列下標(biāo)也可以用來修改元素的值>>>xarray([10,-3,8,-1,6,-2,4,3,2])存取元素>>>x[[3,3,1,8]]#獲取存取元素使用布爾數(shù)組當(dāng)使用布爾數(shù)組b作為下標(biāo)存取數(shù)組x中的元素時,將收集數(shù)組x中所有在數(shù)組b中對應(yīng)下標(biāo)為True的元素。使用布爾數(shù)組作為下標(biāo)獲得的數(shù)組不和原始數(shù)組共享數(shù)據(jù)空間,注意這種方式只對應(yīng)于布爾數(shù)組,不能使用布爾列表。>>>x=np.arange(5,0,-1)>>>xarray([5,4,3,2,1])存取元素使用布爾數(shù)組>>>x=np.arange(5,存取元素

>>>x[np.array([True,False,True,False,False])]>>>#布爾數(shù)組中下標(biāo)為0,2的元素為True,因此獲取x中下標(biāo)為0,2的元素array([5,3])>>>x[[True,False,True,False,False]]>>>#如果是布爾列表,則把True當(dāng)作1,False當(dāng)作0,按照整數(shù)序列方式獲取x中的元素array([4,5,4,5,5])>>>x[np.array([True,False,True,True])]>>>#布爾數(shù)組的長度不夠時,不夠的部分都當(dāng)作Falsearray([5,3,2])>>>x[np.array([True,False,True,True])]=-1,-2,-3>>>#布爾數(shù)組下標(biāo)也可以用來修改元素>>>xarray([-1,4,-2,-3,1])存取元素>>>x[np.array([True,F存取元素布爾數(shù)組一般不是手工產(chǎn)生,而是使用布爾運算的ufunc函數(shù)產(chǎn)生。>>>x=np.random.rand(10)#產(chǎn)生一個長度為10,元素值為0-1的隨機數(shù)的數(shù)組>>>xarray([0.72223939,0.921226,0.7770805,0.2055047,0.17567449,0.95799412,0.12015178,0.7627083,0.43260184,0.91379859])存取元素布爾數(shù)組一般不是手工產(chǎn)生,而是使用布存取元素>>>x>0.5>>>#數(shù)組x中的每個元素和0.5進行大小比較,得到一個布爾數(shù)組,True表示x中對應(yīng)的值大于0.5array([True,True,True,False,False,True,False,True,False,True],dtype=bool)>>>x[x>0.5]>>>#使用x>0.5返回的布爾數(shù)組收集x中的元素,因此得到的結(jié)果是x中所有大于0.5的元素的數(shù)組array([0.72223939,0.921226,0.7770805,0.95799412,0.7627083,0.91379859])存取元素>>>x>0.5多維數(shù)組多維數(shù)組的存取和一維數(shù)組類似,因為多維數(shù)組有多個軸,因此它的下標(biāo)需要用多個值來表示,NumPy采用組元(tuple)作為數(shù)組的下標(biāo)。如下圖所示,a為一個6x6的數(shù)組,圖中用顏色區(qū)分了各個下標(biāo)以及其對應(yīng)的選擇區(qū)域。組元不需要圓括號雖然我們經(jīng)常在Python中用圓括號將組元括起來,但是其實組元的語法定義只需要用逗號隔開即可,例如x,y=y,x就是用組元交換變量值的一個例子。多維數(shù)組多維數(shù)組的存取和一維數(shù)組類似,因為多維數(shù)組如下圖所示,a為一個6x6的數(shù)組,圖中用顏色區(qū)分了各個下標(biāo)以及其對應(yīng)的選擇區(qū)域。多維數(shù)組如下圖所示,a為一個6x6的數(shù)組多維數(shù)組如何創(chuàng)建這個數(shù)組:數(shù)組a實際上是一個加法表,縱軸的值為0,10,20,30,40,50;橫軸的值為0,1,2,3,4,5??v軸的每個元素都和橫軸的每個元素求和,就得到圖中所示的數(shù)組a。你可以用下面的語句創(chuàng)建它。>>>np.arange(0,60,10).reshape(-1,1)+np.arange(0,6)array([[0,1,2,3,4,5],[10,11,12,13,14,15],[20,21,22,23,24,25],[30,31,32,33,34,35],[40,41,42,43,44,45],[50,51,52,53,54,55]])多維數(shù)組如何創(chuàng)建這個數(shù)組:>>>np.ara多維數(shù)組多維數(shù)組同樣也可以使用整數(shù)序列和布爾數(shù)組進行存取。多維數(shù)組多維數(shù)組同樣也可以使用整數(shù)序列和布多維數(shù)組?a[(0,1,2,3,4),(1,2,3,4,5)]:用于存取數(shù)組的下標(biāo)和仍然是一個有兩個元素的組元,組元中的每個元素都是整數(shù)序列,分別對應(yīng)數(shù)組的第0軸和第1軸。從兩個序列的對應(yīng)位置取出兩個整數(shù)組成下標(biāo):a[0,1],a[1,2],...,a[4,5]。?a[3:,[0,2,5]]:下標(biāo)中的第0軸是一個范圍,它選取第3行之后的所有行;第1軸是整數(shù)序列,它選取第0,2,5三列。?a[mask,2]:下標(biāo)的第0軸是一個布爾數(shù)組,它選取第0,2,5行;第1軸是一個整數(shù),選取第2列。多維數(shù)組?a[(0,1,2,3,4),(1,2,3,4,5結(jié)構(gòu)數(shù)組假設(shè)需要定義一個結(jié)構(gòu)數(shù)組,它的每個元素都有name,age和weight字段。在NumPy中可以如下定義:文件名:numpy_struct_array.pyimportnumpyasnppersontype=np.dtype({'names':['name','age','weight'],'formats':['S32','i','f']})a=np.array([("Zhang",32,75.5),("Wang",24,65.2)],dtype=persontype)>>>runnumpy_struct_array.py>>>a.dtypedtype([('name','|S32'),('age','<i4'),('weight','<f4')])結(jié)構(gòu)數(shù)組假設(shè)需要定義一個結(jié)構(gòu)數(shù)組,它的每結(jié)構(gòu)數(shù)組一種描述結(jié)構(gòu)類型的方法:一個包含多個組元的列表,其中形如(字段名,類型描述)的組元描述了結(jié)構(gòu)中的每個字段。類型描述前面為我們添加了`|‘,`<’等字符,這些字符用來描述字段值的字節(jié)順序:?|:忽視字節(jié)順序?<:低位字節(jié)在前?>:高位字節(jié)在前結(jié)構(gòu)數(shù)組一種描述結(jié)構(gòu)類型的方法:一個包含結(jié)構(gòu)數(shù)組結(jié)構(gòu)數(shù)組的存取方式和一般數(shù)組相同,通過下標(biāo)能夠取得其中的元素,注意元素的值看上去像是組元,實際上它是一個結(jié)構(gòu):a[0]是一個結(jié)構(gòu)元素,它和數(shù)組a共享內(nèi)存數(shù)據(jù),因此可以通過修改它的字段,改變原始數(shù)組中的對應(yīng)字段:>>>a[0]('Zhang',32,75.5)>>>a[0].dtypedtype([('name','|S32'),('age','<i4'),('weight','<f4')])>>>c=a[1]>>>c["name"]="Li">>>a[1]["name"]"Li”結(jié)構(gòu)結(jié)構(gòu)數(shù)組結(jié)構(gòu)數(shù)組的存取方式和一般數(shù)組相同,結(jié)構(gòu)數(shù)組結(jié)構(gòu)像字典一樣可以通過字符串下標(biāo)獲取其對應(yīng)的字段值:不但可以獲得結(jié)構(gòu)元素的某個字段,還可以直接獲得結(jié)構(gòu)數(shù)組的字段,它返回的是原始數(shù)組的視圖,因此

可以通過修改b[0]改變a[0][‘’age‘’]:>>>b=a[:]["age"]#或者a["age"]>>>barray([32,24])>>>b[0]=40>>>a[0]["age"]40>>>a[0]["name"]'Zhang'結(jié)構(gòu)數(shù)組結(jié)構(gòu)像字典一樣可以通過字符串下標(biāo)獲取NumPy—ufunc運算NumPy—ufunc運算目錄ufunc運算簡介廣播ufunc的方法目錄ufunc運算簡介ufunc運算簡介ufunc是universalfunction的縮寫,它是一種能對數(shù)組的每個元素進行操作的函數(shù)。

NumPy內(nèi)置的許多ufunc函數(shù)都是在C語言級別實現(xiàn)的,因此它們的計算速度非常快。#對數(shù)組x中的每個元素進行正弦計算,返回一個同樣大小的新數(shù)組>>>x=np.linspace(0,2*np.pi,10)>>>y=np.sin(x)>>>yarray([0.00000000e+00,6.42787610e-01,9.84807753e-01,8.66025404e-01,3.42020143e-01,-3.42020143e-01,-8.66025404e-01,-9.84807753e-01,-6.42787610e-01,-2.44921271e-16])ufunc運算簡介ufunc是univeufunc運算簡介計算之后x中的值并沒有改變,而是新創(chuàng)建了一個數(shù)組保存結(jié)果。如果希望將sin函數(shù)所計算的結(jié)果直接覆蓋到數(shù)組x上去的話,可以將要被覆蓋的數(shù)組作為第二個參數(shù)傳遞給ufunc函數(shù)。例如:

>>>t=np.sin(x,x)>>>xarray([0.00000000e+00,6.42787610e-01,9.84807753e-01,8.66025404e-01,3.42020143e-01,-3.42020143e-01,-8.66025404e-01,-9.84807753e-01,-6.42787610e-01,-2.44921271e-16])>>>id(t)==id(x)Trueufunc運算簡介計算之后x中的值并沒有ufunc運算簡介

用下面這個小程序,比較了一下numpy.math和Python標(biāo)準(zhǔn)庫的math.sin的計算速度:(numpy_speed_test.py)importtimeimportmathimportnumpyasnpx=[i*0.001foriinxrange(1000000)]start=time.clock()fori,tinenumerate(x):x[i]=math.sin(t)print"math.sin:",time.clock()-startufunc運算簡介用下面這個小程序,比較ufunc運算簡介

x=[i*0.001foriinxrange(1000000)]x=np.array(x)start=time.clock()np.sin(x,x)print"numpy.sin:",time.clock()–startx=[i*0.001foriinxrange(1000000)]start=time.clock()fori,tinenumerate(x):x[i]=np.sin(t)print"numpy.sinloop:",time.clock()–start#輸出#math.sin:1numpy.sin:0.0882399858083#numpy.sinloop:5.72166965355ufunc運算簡介x=[i*0.001foriufunc運算簡介numpy.sin的計算速度只有math.sin的1/5。這是因為numpy.sin為了同時支持數(shù)組和單個值的計算,其C語言的內(nèi)部實現(xiàn)要比math.sin復(fù)雜很多。

numpy.sin比math.sin快10倍多。這得利于numpy.sin在C語言級別的循環(huán)計算。

numpy.sin同樣也支持對單個數(shù)值求正弦,不過對單個數(shù)的計算math.sin則比numpy.sin快得多了。ufunc運算簡介numpy.sin的ufunc運算簡介

此外,numpy.sin返回的數(shù)的類型和math.sin返回的類型有所不同,math.sin返回的是Python的標(biāo)準(zhǔn)float類型,而numpy.sin則返回一個numpy.float64類型:因為它們各有長短,因此在導(dǎo)入時不建議使用*號全部載入,而是應(yīng)該使用importnumpyasnp的方式載入,這樣可以根據(jù)需要選擇合適的函數(shù)調(diào)用。>>>type(math.sin(0.5))<type'float'>>>>type(np.sin(0.5))<type'numpy.float64'>ufunc運算簡介此外,numpy.sinufunc運算簡介四則運算:NumPy中有眾多的ufunc函數(shù)提供各式各樣的計算。

>>>a=np.arange(0,4)>>>aarray([0,1,2,3])>>>b=np.arange(1,5)>>>barray([1,2,3,4])>>>np.add(a,b)array([1,3,5,7])>>>np.add(a,b,a)#第3個參數(shù)指定計算結(jié)果所要寫入的數(shù)組,如果指定的話,add函數(shù)就不再產(chǎn)生新的數(shù)組。array([1,3,5,7])>>>aarray([1,3,5,7])ufunc運算簡介四則運算:>>>a=np.arangufunc運算簡介由于Python的操作符重載功能,計算兩個數(shù)組相加可以簡單地寫為a+b,而np.add(a,b,a)則可以用a+=b來表示。下面是數(shù)組的運算符和其對應(yīng)的ufunc函數(shù)的一個列表,注意除號‘’/‘’的意義根據(jù)是否激活__future__.division有所不同。y=x1+x2:add(x1,x2[,y])y=x1-x2:subtract(x1,x2[,y])y=x1*x2:multiply(x1,x2[,y])y=x1/x2:divide(x1,x2[,y]),如果兩個數(shù)組的元素為整數(shù),那么用整數(shù)除法y=x1/x2:truedivide(x1,x2[,y]),總是返回精確的商y=x1//x2:floordivide(x1,x2[,y]),總是對返回值取整y=-x:negative(x[,y])y=x1**x2:power(x1,x2[,y])y=x1%x2:remainder(x1,x2[,y]),mod(x1,x2,[,y])ufunc運算簡介由于Python的操作ufunc運算簡介數(shù)組對象支持這些操作符,極大地簡化了算式的編寫,不過要注意如果你的算式很復(fù)雜,并且要運算的數(shù)組很大的話,會因為產(chǎn)生大量的中間結(jié)果而降低程序的運算效率。例如:假設(shè)abc三個數(shù)組采用算式x=a*b+c計算,那么它相當(dāng)于:

也就是說需要產(chǎn)生一個數(shù)組t保存乘法的計算結(jié)果,然后再產(chǎn)生最后的結(jié)果數(shù)組x。我們可以通過手工將一個算式分解為x=a*b;x+=c,以減少一次內(nèi)存分配。t=a*bx=t+cdeltufunc運算簡介數(shù)組對象支持這些操作符ufunc運算簡介比較和布爾運算:使用“==”、“>”等比較運算符對兩個數(shù)組進行比較,將返回一個布爾數(shù)組,它的每個元素值都是兩個數(shù)組對應(yīng)元素的比較結(jié)果。例如:>>>np.array([1,2,3])<np.array([3,2,1])

array([True,False,False],dtype=bool)ufunc運算簡介比較和布爾運算:>>>np.arrufunc運算簡介每個比較運算符也與一個ufunc函數(shù)對應(yīng),下面是比較運算符和其ufunc函數(shù)的:y=x1==x2equal(x1,x2[,y])y=x1!=x2not_equal(x1,x2[,y])y=x1<x2less(x1,x2,[,y])y=x1<=x2less_equal(x1,x2,[,y])y=x1>x2greater(x1,x2,[,y])y=x1>=x2greater_equal(x1,x2,[,y])ufunc運算簡介每個比較運算符也與一ufunc運算簡介

由于Python中的布爾運算使用and、or和not等關(guān)鍵字,它們無法被重載,因此數(shù)組的布爾運算只能通過相應(yīng)的ufunc函數(shù)進行。這些函數(shù)名都以“l(fā)ogical_”開頭,在IPython中使用自動補全即可找到它們.>>>a=np.arange(5)>>>b=np.arange(4,-1,-1)>>>a==barray([False,False,True,False,False],dtype=bool)>>>a>barray([False,False,False,True,True],dtype=bool)>>>np.logical_or(a==b,a>b)#和a>=b相同array([False,False,True,True,True],dtype=bool)ufunc運算簡介由于Python中的布ufunc運算簡介可以使用數(shù)組的any()或all()方法。只要數(shù)組中有一個值為True,則any()返回True;而只有數(shù)組的全部元素都為True,all()才返回True。>>>np.any(a==b)True>>>np.any(a==b)andnp.any(a>b)Trueufunc運算簡介可以使用數(shù)組的any()ufunc運算簡介自定義ufunc函數(shù):

通過組合標(biāo)準(zhǔn)的ufunc函數(shù)的調(diào)用,可以實現(xiàn)各種算式的數(shù)組計算。不過有些時候這種算式不易編寫,而針對每個元素的計算函數(shù)卻很容易用Python實現(xiàn),這時可以用frompyfunc函數(shù)將一個計算單個元素的函數(shù)轉(zhuǎn)換成ufunc函數(shù)。這樣就可以方便地用所產(chǎn)生的ufunc函數(shù)對數(shù)組進行計算了。ufunc運算簡介自定義ufunc函數(shù):ufunc運算簡介用一個分段函數(shù)描述三角波,三角波的樣子如下:ufunc運算簡介用一個分段函數(shù)描述三角波ufunc運算簡介根據(jù)上圖所示寫出如下的計算三角波某點y坐標(biāo)的函數(shù):顯然triangle_wave函數(shù)只能計算單個數(shù)值,不能對數(shù)組直接進行處理。deftriangle_wave(x,c,c0,hc):x=x-int(x)#三角波的周期為1,因此只取x坐標(biāo)的小數(shù)部分進行計算ifx>=c:r=0.0elifx<c0:r=x/c0*hcelse:r=(c-x)/(c-c0)*hcreturnrufunc運算簡介根據(jù)上圖所示寫出如下的計算ufunc運算簡介可以先使用列表包容(Listcomprehension),計算出一個list,然后用array函數(shù)將列表轉(zhuǎn)換為數(shù)組:

這種做法每次都需要使用列表包容語法調(diào)用函數(shù),對于多維數(shù)組是很麻煩的。讓我們來看看如何用frompyfunc函數(shù)來解決這個問題:x=np.linspace(0,2,1000)y1=np.array([triangle_wave(t,0.6,0.4,1.0)fortinx])ufunc運算簡介可以先使用列表包容(Listufunc運算簡介通過frompyfunc()可以將計算單個值的函數(shù)轉(zhuǎn)換為一個能對數(shù)組的每個元素進行計算的ufunc函數(shù)。frompyfunc()的調(diào)用格式為:

其中func是計算單個元素的函數(shù),nin是func的輸入?yún)?shù)的個數(shù),nout是func的返回值個數(shù)。下面的程序使用frompyfunc()將triangle_wave()轉(zhuǎn)換為一個ufunc函數(shù)對象triangle_ufunc1:frompyfunc(func,nin,nout)ufunc運算簡介通過frompyfuncufunc運算簡介triangle_ufunc2=np.frompyfunc(lambdax:triangle_wave(x,0.6,0.4,1.0),1,1)y3=triangle_ufunc2(x)雖然triangle_wave函數(shù)有4個參數(shù),但是由于后三個c,c0,hc在整個計算中值都是固定的,因此所產(chǎn)生的ufunc函數(shù)其實只有一個參數(shù)。為了滿足這個條件,可用一個lambda函數(shù)對triangle_wave的參數(shù)進行一次包裝。這樣傳入frompyfunc的函數(shù)就只有一個參數(shù)了。triangle_ufunc1=np.frompyfunc(triangle_wave,4,1)y2=triangle_ufunc1(x,0.6,0.4,1.0)ufunc運算簡介triangle_ufunc2=np.ufunc運算簡介值得注意的是,triangle_ufunc1()所返回的數(shù)組的元素類型是object,因此還需要再調(diào)用數(shù)組的astype()方法將其轉(zhuǎn)換為雙精度浮點數(shù)組:>>>y2.dtypedtype('object')>>>y2=y2.astype(np.float)>>>y2.dtypedtype('float64')>>>y3.dtypedtype('object')>>>y3=y3.astype(np.float)>>>y3.dtypedtype('float64')ufunc運算簡介值得注意的是,triaufunc運算簡介使用vectorize()也可以實現(xiàn)和frompyfunc()類似的功能,但它可以通過otypes參數(shù)指定返回數(shù)組的元素類型。otypes參數(shù)可以是一個表示元素類型的字符串,或者是一個類型列表,使用列表可以描述多個返回數(shù)組的元素類型。下面的程序使用vectorize()計算三角波:triangle_ufunc3=np.vectorize(triangle_wave,otypes=[np.float])y4=triangle_ufunc3(x,0.6,0.4,1.0)ufunc運算簡介使用vectorizeufunc運算簡介最后驗證一下結(jié)果:>>>np.all(y1==y2)True>>>np.all(y2==y3)True>>>np.all(y3==y4)Trueufunc運算簡介最后驗證一下結(jié)果:>>>np.all(y廣播當(dāng)我們使用ufunc函數(shù)對兩個數(shù)組進行計算時,ufunc函數(shù)會對這兩個數(shù)組的對應(yīng)元素進行計算,因此它要求這兩個數(shù)組有相同的大小(shape相同)。如果兩個數(shù)組的shape不同的話,會進行如下的廣播(broadcasting)處理:廣播當(dāng)我們使用ufunc函數(shù)對兩個數(shù)組進行廣播1.讓所有輸入數(shù)組都向其中shape最長的數(shù)組看齊,shape中不足的部分都通過在前面加1補齊。2.輸出數(shù)組的shape是輸入數(shù)組shape的各個軸上的最大值。3.如果輸入數(shù)組的某個軸和輸出數(shù)組的對應(yīng)軸的長度相同或者其長度為1時,這個數(shù)組能夠用來計算,否則出錯。4.當(dāng)輸入數(shù)組的某個軸的長度為1時,沿著此軸運算時都用此軸上的第一組值。廣播1.讓所有輸入數(shù)組都向其中shap廣播看一個實際的例子。先創(chuàng)建一個二維數(shù)組a,其shape為(6,1):再創(chuàng)建一維數(shù)組b,其shape為(5,):>>>a=np.arange(0,60,10).reshape(-1,1)>>>aarray([[0],[10],[20],[30],[40],[50]])>>>a.shape(6,1)>>>b=np.arange(0,5)>>>barray([0,1,2,3,4])>>>b.shape(5,)廣播看一個實際的例子。先創(chuàng)建一個二維數(shù)組a,廣播計算a和b的和,得到一個加法表,它相當(dāng)于計算a,b中所有元素組的和,得到一個shape為(6,5)的數(shù)組:>>>c=a+b>>>carray([[0,1,2,3,4],[10,11,12,13,14],[20,21,22,23,24],[30,31,32,33,34],[40,41,42,43,44],[50,51,52,53,54]])>>>c.shape(6,5)廣播計算a和b的和,得到一個加法表,它相廣播由于a和b的shape長度(也就是ndim屬性)不同,根據(jù)規(guī)則1,需要讓b的shape向a對齊,于是將b的shape前面加1,補齊為(1,5)。相當(dāng)于做了如下計算:

這樣加法運算的兩個輸入數(shù)組的shape分別為(6,1)和(1,5),根據(jù)規(guī)則2,輸出數(shù)組的各個軸的長度為輸入數(shù)組各個軸上的長度的最大值,可知輸出數(shù)組的shape為(6,5)。>>>b.shape=1,5>>>barray([[0,1,2,3,4]])廣播由于a和b的shape長度(也就是n廣播由于b的第0軸上的長度為1,而a的第0軸上的長度為6,因此為了讓它們在第0軸上能夠相加,需要將b在第0軸上的長度擴展為6,這相當(dāng)于:>>>b=b.repeat(6,axis=0)>>>barray([[0,1,2,3,4],[0,1,2,3,4],[0,1,2,3,4],[0,1,2,3,4],[0,1,2,3,4],[0,1,2,3,4]])廣播由于b的第0軸上的長度為1,而a的第0廣播由于a的第1軸的長度為1,而b的第一軸長度為5,因此為了讓它們在第1軸上能夠相加,需要將a在第1軸上的長度擴展為5,這相當(dāng)于:

經(jīng)過上述處理之后,a和b就可以按對應(yīng)元素進行相加運算了。>>>a=a.repeat(5,axis=1)>>>aarray([[0,0,0,0,0],[10,10,10,10,10],[20,20,20,20,20],[30,30,30,30,30],[40,40,40,40,40],[50,50,50,50,50]])廣播由于a的第1軸的長度為1,而b的第一軸廣播

numpy在執(zhí)行a+b運算時,其內(nèi)部并不會真正將長度為1的軸用repeat函數(shù)進行擴展,如果這樣做的話就太浪費空間了。由于這種廣播計算很常用,因此numpy提供了一個快速產(chǎn)生如上面a,b數(shù)組的方法:ogrid對象:>>>x,y=np.ogrid[0:5,0:5]>>>xarray([[0],[1],[2],[3],[4]])>>>yarray([[0,1,2,3,4]])廣播numpy在執(zhí)行a+b運算時,其內(nèi)部并廣播ogrid是一個很有趣的對象,它像一個多維數(shù)組一樣,用切片組元作為下標(biāo)進行存取,返回的是一組可以用來廣播計算的數(shù)組。其切片下標(biāo)有兩種形式:?開始值:結(jié)束值:步長,和np.arange(開始值,結(jié)束值,步長)類似?開始值:結(jié)束值:長度j,當(dāng)?shù)谌齻€參數(shù)為虛數(shù)時,它表示返回的數(shù)組的長度,和np.linspace(開始值,結(jié)束值,長度)類似:廣播ogrid是一個很有趣的對象,它像一廣播ogrid為什么不是函數(shù):根據(jù)Python的語法,只有在中括號中才能使用用冒號隔開的切片語法,如果ogrid是函數(shù)的話,那么這些切片必須使用slice函數(shù)創(chuàng)建,這顯然會增加代碼的長度。>>>x,y=np.ogrid[0:1:4j,0:1:3j]>>>xarray([[0.],[0.33333333],[0.66666667],[1.]])>>>yarray([[0.,0.5,1.]])廣播>>>x,y=np.ogrid[0:1:4j,廣播利用ogrid的返回值,能很容易計算x,y網(wǎng)格面上各點的值,或者x,y,z網(wǎng)格體上各點的值。下面是繪制三維曲面x*exp(x**2-y**2)的程序:(numpy_orid_mlab.py)importnumpyasnpfrommayaviimportmlabx,y=np.ogrid[-2:2:20j,-2:2:20j]z=x*np.exp(-x**2-y**2)pl=mlab.surf(x,y,z,warp_scale="auto")mlab.axes(xlabel='x',ylabel='y',zlabel='z')mlab.outline(pl)mlab.show廣播利用ogrid的返回值,能很容易計算x,廣播此程序使用mayavi的mlab庫快速繪制3D曲面,關(guān)于mlab的相關(guān)內(nèi)容將在今后的章節(jié)進行介紹。廣播此程序使用mayavi的mlab庫快速繪ufunc的方法

ufunc函數(shù)本身還有些方法,這些方法只對兩個輸入一個輸出的ufunc函數(shù)有效,其它的ufunc對象調(diào)用這些方法時會拋出ValueError異常。reduce方法和Python的reduce函數(shù)類似,它沿著axis軸對array進行操作.>>>np.add.reduce([1,2,3])#1+2+36>>>np.add.reduce([[1,2,3],[4,5,6]],axis=1)#(1+2+3),(4+5+6)array([6,15])np.add.reduce([[1,2,3],[4,5,6]],axis=0)array([5,7,9])ufunc的方法ufunc函數(shù)本身還有些方ufunc的方法accumulate方法和reduce方法類似,只是它返回的數(shù)組和輸入的數(shù)組的shape相同,保存所有的中間計算結(jié)果:>>>np.add.accumulate([1,2,3])array([1,3,6])>>>np.add.accumulate([[1,2,3],[4,5,6]],axis=1)array([[1,3,6],[4,9,15]])ufunc的方法accumulate方ufunc的方法

reduceat方法計算多組reduce的結(jié)果,通過indices參數(shù)指定一系列reduce的起始和終了位置。reduceat的計算有些特別,讓我們通過一個例子來解釋一下:>>>a=np.array([1,2,3,4])>>>result=np.add.reduceat(a,indices=[0,1,0,2,0,3,0])>>>resultarray([1,2,3,3,6,4,10])ifindices[i]<indices[i+1]:result[i]=np.reduce(a[indices[i]:indices[i+1]])else:result[i]=a[indices[i]]ufunc的方法reduceat方法計ufunc的方法對于indices中的每個元素都會調(diào)用reduce函數(shù)計算出一個值來,因此最終計算結(jié)果的長度和indices的長度相同。結(jié)果result數(shù)組中除最后一個元素之外,都按照如下計算得出:

而最后一個元素如下計算:ifindices[i]<indices[i+1]:result[i]=np.reduce(a[indices[i]:indices[i+1]])else:result[i]=a[indices[i]]np.reduce(a[indices[-1]:])ufunc的方法對于indices中的每ufunc的方法因此上面例子中,結(jié)果的每個元素如下計算而得:可以看出result[::2]和a相等,而result[1::2]和np.add.accumulate(a)相等。1:a[0]=12:a[1]=23:a[0]+a[1]=1+23:a[2]=36:a[0]+a[1]+a[2]=1+2+3=64:a[3]=410:a[0]+a[1]+a[2]+a[3]=1+2+3+4=10ufunc的方法因此上面例子中,結(jié)果的每個ufunc的方法outer方法,對其兩個參數(shù)數(shù)組的每兩對元素的組合進行運算。若數(shù)組a的維數(shù)為M,數(shù)組b的維數(shù)為N,則ufunc函數(shù)op的outer()方法對a、b數(shù)組計算所生成的數(shù)組c的維數(shù)為M+N。c的形狀是a、b的形狀的結(jié)合。例如a的形狀為(2,3),b的形狀為(4,5),則c的形狀為(2,3,4,5)。<op>.outer(a,b)方法的計算等同于如下程序:其中squeeze的功能是剔除數(shù)組a中長度為1的軸。>>>a.shape+=(1,)*b.ndim>>><op>(a,b)>>>a=a.squeeze()ufunc的方法outer方法,對其兩ufunc的方法如果不太明白這個等同程序的話,可看一個例子:>>>np.multiply.outer([1,2,3,4,5],[2,3,4])array([[2,3,4],[4,6,8],[6,9,12],[8,12,16],[10,15,20]])ufunc的方法如果不太明白這個等同程序的ufunc的方法可以看出通過outer方法計算的結(jié)果是如下的乘法表:如果將這兩個數(shù)組按照等同程序一步一步的計算的話,就會發(fā)現(xiàn)乘法表最終是通過廣播的方式計算出來的。*|234------------1|2342|4683|69124|812165|101520ufunc的方法可以看出通過outer方Python基礎(chǔ)—矩陣運算Python基礎(chǔ)—矩陣運算矩陣運算NumPy和Matlab不一樣,對于多維數(shù)組的運算,缺省情況下并不使用矩陣運算,如果你希望對數(shù)組進行矩陣運算的話,可以調(diào)用相應(yīng)的函數(shù)。matrix對象(np.mat)numpy庫提供了matrix類,使用matrix類創(chuàng)建的是矩陣對象,它們的加減乘除運算缺省采用矩陣方式計算,因此用法和matlab十分類似。但是由于NumPy中同時存在ndarray和matrix對象,因此用戶很容易將兩者弄混。這有違Python的“顯式優(yōu)于隱式”的原則,因此并不推薦在較復(fù)雜的程序中使用matrix。矩陣運算NumPy和Matlab不一樣,矩陣運算

下面是使用matrix的一個例子:因為a是用matrix創(chuàng)建的矩陣對象,因此乘法和冪運算符都變成了矩陣運算,于是上面計算的是矩陣a和其逆矩陣的乘積,結(jié)果是一個單位矩陣。>>>a=np.matrix([[1,2,3],[5,5,6],[7,9,9]])#np.mat>>>a*a**-1matrix([[1.00000000e+00,1.66533454e-16,-8.32667268e-17],[-2.77555756e-16,1.00000000e+00,-2.77555756e-17],[1.66533454e-16,5.55111512e-17,1.00000000e+00]])矩陣運算下面是使用matrix的一個例子:>>矩陣運算矩陣的乘積可以使用dot函數(shù)進行計算。對于二維數(shù)組,它計算的是矩陣乘積,對于一維數(shù)組,它計算的是其點積。當(dāng)需要將一維數(shù)組當(dāng)作列矢量或者行矢量進行矩陣運算時,推薦先使用reshape函數(shù)將一維數(shù)組轉(zhuǎn)換為二維數(shù)組:>>>a=array([1,2,3])>>>a.reshape((-1,1))array([[1],[2],[3]])>>>a.reshape((1,-1))array([[1,2,3]])矩陣運算矩陣的乘積可以使用dot函數(shù)進行計矩陣運算

實際上Python官方文檔建議我們使用二維數(shù)組代替矩陣來進行矩陣運算;因為二維數(shù)組用得較多,而且基本可取代矩陣。

矩陣的轉(zhuǎn)置:>>>A=np.array([[1,2,3],[3,4,5],[6,7,8]])>>>A>>>A.T#A的轉(zhuǎn)置>>>A.T.T#A的轉(zhuǎn)置的轉(zhuǎn)置還是A本身矩陣運算實際上Python官方文檔建議我們矩陣運算方陣的跡:>>>A=np.array([[1,2,3],[3,4,5],[6,7,8]])>>>Aarray([[1,2,3],[3,4,5],[6,7,8]])>>>np.trace(A)13>>>np.trace(A.T)13矩陣運算方陣的跡:>>>A=np.array([[1,矩陣運算NumPy也允許你使用“點”(…)代表許多產(chǎn)生一個完整的索引元組必要的分號。如果x是秩為5的數(shù)組(即它有5個軸),那么:

x[1,2,…]等同于x[1,2,:,:,:],

x[…,3]等同于x[:,:,:,:,3]

x[4,…,5,:]等同x[4,:,:,5,:].#a3Darray(twostacked2Darrays)>>>c=array([[[0,1,2],[10,12,13]],[[100,101,102],[110,112,113]]])矩陣運算NumPy也允許你使用“點”(矩陣運算

#a3Darray(twostacked2Darrays)>>>c=array([[[0,1,2],[10,12,13]],[[100,101,102],[110,112,113]]])>>>c.shape(2,2,3)>>>c[1,...]#sameasc[1,:,:]orc[1]array([[100,101,102],[110,112,113]])>>>c[...,2]#sameasc[:,:,2]array([[2,13],[102,113]])矩陣運算#a3Darray(twostacked矩陣運算除了dot計算乘積之外,NumPy還提供了inner和outer等多種計算乘積的函數(shù)。這些函數(shù)計算乘積的方式不同,尤其是當(dāng)對于多維數(shù)組的時候,更容易搞混。?dot:對于兩個一維的數(shù)組,計算的是這兩個數(shù)組對應(yīng)下標(biāo)元素的乘積和(數(shù)學(xué)上稱之為內(nèi)積);對于二維數(shù)組,計算的是兩個數(shù)組的矩陣乘積;對于多維數(shù)組,它的通用計算公式如下,即結(jié)果數(shù)組中的每個元素都是:數(shù)組a的最后一維上的所有元素與數(shù)組b的倒數(shù)第二維上的所有元素的乘積和:dot(a,b)[i,j,k,m]=sum(a[i,j,:]*b[k,:,m])矩陣運算除了dot計算乘積之外,NumP矩陣運算

下面以兩個3維數(shù)組的乘積演示一下dot乘積的計算結(jié)果,首先創(chuàng)建兩個3維數(shù)組,這兩個數(shù)組的最后兩維滿足矩陣乘積的條件:dot乘積的結(jié)果c可以看作是數(shù)組a,b的多個子矩陣的乘積:>>>a=np.arange(12).reshape(2,3,2)>>>b=np.arange(12,24).reshape(2,2,3)>>>c=np.dot(a,b)>>>np.alltrue(c[0,:,0,:]==np.dot(a[0],b[0]))True>>>np.alltrue(c[1,:,0,:]==np.dot(a[1],b[0]))True>>>np.alltrue(c[0,:,1,:]==np.dot(a[0],b[1]))True>>>np.alltrue(c[1,:,1,:]==np.dot(a[1],b[1]))True矩陣運算下面以兩個3維數(shù)組的乘積演示一下d矩陣運算?inner:和dot乘積一樣,對于兩個一維數(shù)組,計算的是這兩個數(shù)組對應(yīng)下標(biāo)元素的乘積和;對于多維數(shù)組,它計算的結(jié)果數(shù)組中的每個元素都是:數(shù)組a和b的最后一維的內(nèi)積,因此數(shù)組a和b的最后一維的長度必須相同:inner(a,b)[i,j,k,m]=sum(a[i,j,:]*b[k,m,:])矩陣運算?inner:和dot乘積一矩陣運算下面是inner乘積的演示:>>>a=np.arange(12).reshape(2,3,2)>>>b=np.arange(12,24).reshape(2,3,2)>>>c=np.inner(a,b)>>>c.shape(2,3,2,3)>>>c[0,0,0,0]==np.inner(a[0,0],b[0,0])True>>>c[0,1,1,0]==np.inner(a[0,1],b[1,0])True>>>c[1,2,1,2]==np.inner(a[1,2],b[1,2])True矩陣運算下面是inner乘積的演示:>>>a=矩陣運算?outer:只按照一維數(shù)組進行計算,如果傳入?yún)?shù)是多維數(shù)組,則先將此數(shù)組展平為一維數(shù)組之后再進行運算。outer乘積計算的列向量和行向量的矩陣乘積:矩陣中更高級的一些運算可以在NumPy的線性代數(shù)子庫linalg中找到。例如inv函數(shù)計算逆矩陣,solve函數(shù)可以求解多元一次方程組。下面是solve函數(shù)的一個例子:>>>np.outer([1,2,3],[4,5,6,7])array([[4,5,6,7],[8,

溫馨提示

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

評論

0/150

提交評論