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

下載本文檔

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

文檔簡介

Python科學計算、數(shù)據(jù)處理與數(shù)據(jù)分析第一章Python基礎(chǔ)本章主要內(nèi)容1.1

Python簡介1.2Python環(huán)境安裝1.3IPython概述1.4JupyterNotebookPython是一種解釋型、面向?qū)ο?、動態(tài)數(shù)據(jù)類型的高級程序設(shè)計語言為什么使用Python①Python完全免費,而MATLAB是一款價格昂貴的商用軟件。②Python是開源的,因此用戶可以更改科學計算的算法細節(jié)。③Python是一門更易學、更嚴謹?shù)某绦蛟O(shè)計語言,它能讓用戶編寫出更易讀、易維護的代碼。④Python有著豐富的擴展庫,可以輕易完成各種高級任務(wù),開發(fā)者可以用Python實現(xiàn)完整應(yīng)用程序所需的各種功能。1.1Python簡介Python2和Python3Python3在設(shè)計的時候很好地解決了Python2的遺留問題,并且在性能上也有了一定的提升。1.1Python簡介Anaconda下載及安裝在Anaconda官網(wǎng)上找到安裝程序和安裝說明官方網(wǎng)址:/國內(nèi)源:/anaconda/miniconda/1.2Python環(huán)境安裝完成下載之后,雙擊下載的文件,啟動安裝程序1.2.2安裝和更新Python包在Python學習中,可能需要安裝Anaconda中并不包含的額外的Python包。通常通過以下命令進行安裝。

condainstallpackage_name如果這個命令安裝不成功,可以使用pip包管理工具命令進行安裝。

pipinstallpackage_name1.2Python環(huán)境安裝還可以使用condaupdata命令來更新包。condaupdatapackage_namepip還支持通過-upgradepackage_name標識升級。pipinstall–upgradepackage_name1.2Python環(huán)境安裝Python解釋器盡管我們可以使用這種方式執(zhí)行所有的代碼,但是從事科學計算和數(shù)據(jù)分析的人們大多更喜歡使用IPython和JupyterNotebook。

1.3IPython概述IPython的概念及安裝如果安裝的是Anaconda,那么IPython已經(jīng)安裝好(因為Anaconda自帶了IPython)。選擇Anaconda3(64-bit)中的Ipython命令就可以啟動IPython1.3IPython概述IPython的概念及安裝如果安裝的是Anaconda,那么IPython已經(jīng)安裝好(因為Anaconda自帶了IPython)。選擇Anaconda3(64-bit)中的Ipython命令就可以啟動IPython1.3IPython概述IPython的應(yīng)用In[x]和Out[x]顯示Tab自動補全:按Tab鍵即可為任意對象(變量、命令、方法、屬性、模塊)搜索命名空間,與目前已輸入的字符串進行匹配內(nèi)省:在一個變量名的前后使用問號(?)可以顯示關(guān)于該對象的詳細信息①object?或?object:顯示該對象的一些通用信息。注意,Python里面一切皆對象,包括函數(shù)、類和簡單型變量。②

object??或??object:兩個問號顯示詳細信息,如果是類或函數(shù),還會顯示源代碼。Tips:使用help()函數(shù)也可以獲取對象的幫助信息,獲得的幫助信息往往比使用?和??獲得的更多,1.3IPython概述IPython的應(yīng)用使用歷史命令:IPython支持使用上/下鍵來查看歷史命令,也可以使用Ctrl+P/N組合鍵來查看歷史命令魔術(shù)命令:魔術(shù)命令以%為前綴,例如%magic、%timeit。IPython的調(diào)試pdb調(diào)試器

①第一種方式是直接使用命令行參數(shù)指定使用pdb模塊啟動Python文件,這種方式在文件的第一行就啟動了Python調(diào)試器,因此適合代碼文件較小的情況。例如,文件名是test.py,啟動pdb調(diào)試器只需要使用下面的命令。python-mpdbtest.py1.3IPython概述IPython的調(diào)試pdb調(diào)試器第二種方式是在Python代碼中調(diào)用pdb模塊的set_trace()函數(shù)設(shè)置一個斷點,當程序運行到此斷點的時候,程序?qū)和?zhí)行并打開pdb調(diào)試器,這種方式適合代碼文件較大的情況。例如,在下面的代碼中使用pdb.set_trace()函數(shù)在程序的任意位置設(shè)置斷點。importpdbdefget_sum(n):cnt=0foriinrange(n):#設(shè)置斷點

pdb.set_trace()cnt+=iprint(cnt)if__name__=='__main__':get_sum(5)1.3IPython概述IPython的調(diào)試ipdb調(diào)試器ipdb調(diào)試器集成和加強了Python的pdb調(diào)試器,比pdb多了語法高亮、Tab自動補全等功能,在易用性方面做了很大的改進1.3IPython概述JupyterNotebook簡介1.4JupyterNotebookJupyterNotebook的應(yīng)用JupyterNotebook中有個叫作“工作空間”(工作目錄)的概念,工作空間實際上就是存放以后創(chuàng)建的.ipynb文件的目錄為了方便對文檔進行管理,用戶往往需要自行設(shè)置工作空間1.4JupyterNotebookJupyterNotebook的應(yīng)用1.新建文件1.4JupyterNotebookJupyterNotebook的應(yīng)用1.新建文件每一個JupyterNotebook主要包含4個區(qū)域:文件名、菜單欄、工具欄、編輯區(qū),如圖1-25所示。單擊文件名Untitled,可以重命名當前JupyterNotebook的文件名1.4JupyterNotebookJupyterNotebook的應(yīng)用1.新建文件每一個JupyterNotebook主要包含4個區(qū)域:文件名、菜單欄、工具欄、編輯區(qū),如圖1-25所示。單擊文件名Untitled,可以重命名當前JupyterNotebook的文件名1.4JupyterNotebookJupyterNotebook的應(yīng)用2.編輯和運行3.兩種模式切換1.4JupyterNotebookPython科學計算、數(shù)據(jù)處理與數(shù)據(jù)分析第2章NumPy基礎(chǔ)本章主要內(nèi)容2.1Python與數(shù)組的關(guān)系2.2N維數(shù)組對象ndarray2.3通用函數(shù)2.4聚合函數(shù)2.5排序函數(shù)2.6隨機數(shù)生成函數(shù)2.7Numpy廣播準確來說,Python中沒有數(shù)組類型,取而代之的是列表(list)和元組(tuple)。元組一旦定義就無法修改,列表比元組好用,列表可以修改Python中用列表保存一組值,列表的元素可以是任何對象,列表中保存的是對象的指針--這種結(jié)構(gòu)對于數(shù)值運算來說顯然比較浪費內(nèi)存和CPU的計算時間Python還提供了一個array模塊,該模塊中的array對象和列表不同,它直接保存數(shù)值,與C語言的一維數(shù)組比較類似。但是由于它沒有各種運算函數(shù),因此也不適合做數(shù)值運算。2.1Python與數(shù)組的關(guān)系NumPy的誕生彌補了list和array的這些不足,它主要包含以下內(nèi)容。①一個強大的N維數(shù)組對象ndarray。②眾多具有廣播功能的通用函數(shù)。③包含線性代數(shù)、隨機數(shù)生成等各種數(shù)學模塊。

導入NumPy模塊。importnumpyasnp2.1Python與數(shù)組的關(guān)系Python已有列表類型和array模塊,為什么需要一個數(shù)組對象(類型)呢?①ndarray使用戶不用編寫循環(huán)就可以對數(shù)組執(zhí)行批量運算,使一維向量更像單個數(shù)據(jù),這通常叫作矢量化(vectorization)。ndarray對象是一個靈活的大數(shù)據(jù)容器,用戶可以利用這種數(shù)組對整塊數(shù)據(jù)執(zhí)行一些數(shù)學運算,其語法跟標量元素之間的運算一樣。②NumPy的算法庫是采用C語言編寫的,在操作內(nèi)存時不需要類型檢查或其他管理程序,因此速度更快。故而NumPy的數(shù)組存儲效率和輸入/輸出性能遠優(yōu)于Python中的嵌套列表,數(shù)組越大,NumPy的優(yōu)勢就越明顯2.2N維數(shù)組對象ndarray2.2.1數(shù)組基本操作創(chuàng)建ndarray對象創(chuàng)建ndarray對象最簡單的方式就是使用NumPy的array()函數(shù),array()函數(shù)可以將Python的任何序列類型轉(zhuǎn)化為ndarray對象。

In[5]:data1_py=[1,2,3,4,5,6,7,8,9]data1_np=np.array(data1_py)如果是嵌套的列表,則轉(zhuǎn)化為多維數(shù)組對象。In[6]:data2_py=[[1,2,3,4,5,6,7,8,9],[1,2,3,4,5,6,7,8,9]]data2_np=np.array(data2_py)data2_npOut[6]:[[123456789][123456789]]2.2N維數(shù)組對象ndarrayndarray數(shù)組對象由以下兩部分構(gòu)成。①實際的數(shù)據(jù)。②描述數(shù)據(jù)的元數(shù)據(jù)(數(shù)據(jù)維度、數(shù)據(jù)類型等)。表2-1所示為描述ndarray數(shù)組對象中元數(shù)據(jù)的屬性和說明。2.2N維數(shù)組對象ndarrayNumPy的數(shù)據(jù)類型NumPy支持的數(shù)據(jù)類型比Python內(nèi)置的類型要多很多,基本可以與C語言的數(shù)據(jù)類型對應(yīng),其中部分類型對應(yīng)于Python內(nèi)置的類型。表2-2所示為常用的NumPy數(shù)據(jù)類型。也可以通過dtype參數(shù)在創(chuàng)建數(shù)組時指定元素類型。In[17]:data3_np=np.array([1,2,3,4,5],64)data3_np.dtypeOut[17]:int64在需要指定數(shù)據(jù)類型時,我們也可以使用字符串來表示元素的類型,例如int8、int16、int32、int64這4種數(shù)據(jù)類型可以使用字符串‘i1’、‘i2’、‘i4’、‘i8’代替。其中i表示有符號的整型(每個類型都有唯一定義它的字符代碼)2.2N維數(shù)組對象ndarray2.2N維數(shù)組對象ndarray2.2.2數(shù)組生成函數(shù)使用NumPy提供的其他函數(shù)快速生成ndarray數(shù)組1.a(chǎn)range()函數(shù)arange()函數(shù)類似Python內(nèi)置函數(shù)range(),通過指定初始值、終止值、步長來創(chuàng)建等差數(shù)列的一維數(shù)組。np.arange(start,stop,step,dtype)2.2N維數(shù)組對象ndarray2.2.2數(shù)組生成函數(shù)使用NumPy提供的其他函數(shù)快速生成ndarray數(shù)組2.linspace()函數(shù)linspace()函數(shù)通過指定初始值、終止值和元素個數(shù)來創(chuàng)建一個由等差數(shù)列構(gòu)成的一維數(shù)組,格式如下。np.linspace(start,stop,num=50,endpoint=True,retstep=False,dtype=None)2.2N維數(shù)組對象ndarray2.2.2數(shù)組生成函數(shù)使用NumPy提供的其他函數(shù)快速生成ndarray數(shù)組3.logspace()函數(shù)logspace()函數(shù)與linspace()函數(shù)類似,只不過logspace()函數(shù)返回一個由等比數(shù)列構(gòu)成的數(shù)組,格式如下。np.logspace(start,stop,num=50,endpoint=True,base=10.0,dtype=None)2.2N維數(shù)組對象ndarray2.2.2數(shù)組生成函數(shù)使用NumPy提供的其他函數(shù)快速生成ndarray數(shù)組4.zeros()函數(shù)zeros()函數(shù)與empty()函數(shù)類似,也是用來創(chuàng)建一個指定形狀(shape)、數(shù)據(jù)類型(dtype)和大小的數(shù)組,zeros()函數(shù)創(chuàng)建的數(shù)組元素以0來填充。np.zero(shape,dtype,order)。2.2N維數(shù)組對象ndarray2.2.2數(shù)組生成函數(shù)使用NumPy提供的其他函數(shù)快速生成ndarray數(shù)組5.frombuffer()、fromstring()、fromfile()frombuffer()、fromstring()、fromfile()等函數(shù)可以從字節(jié)序列或文件創(chuàng)建數(shù)組,下面以frombuffer()函數(shù)為例來介紹它們的用法。frombuffer()函數(shù)用于實現(xiàn)動態(tài)數(shù)組,它接受buffer輸入?yún)?shù),以流的形式讀入轉(zhuǎn)化成ndarray對象。np.frombuffer(buffer,dtype=float,count=-1,offset=0)2.2N維數(shù)組對象ndarray2.2.2數(shù)組生成函數(shù)使用NumPy提供的其他函數(shù)快速生成ndarray數(shù)組5.fromiter()函數(shù)fromiter()函數(shù)從可迭代對象中建立ndarray對象,返回一維數(shù)組,fromiter()函數(shù)格式如下。np.fromiter(iterable,dtype,count=-1)2.2N維數(shù)組對象ndarray2.2.3數(shù)組存取1.一維數(shù)組的索引和切片ndarray數(shù)組可以使用和列表相同的方式(切片和索引)對數(shù)組元素進行存取,即ndarray數(shù)組可以基于0~(n-1)的下標進行索引,也可以使用冒號隔開的2個或3個參數(shù)來表示切片,從原數(shù)組中切割出一個新數(shù)組。2.2N維數(shù)組對象ndarray1.一維數(shù)組的索引和切片①data[x]:用整數(shù)作為下標,用于獲取數(shù)組中下標為x的元素。②data[start:stop]:用切片作為下標,用于獲取下標從start到stop-1數(shù)組中的一部分,包括data[start],但不包括data[stop]。③data[:stop]:切片中省略start下標,表示下標從0開始。④data[start:]:切片中省略stop下標,表示下標從start開始到最后一個元素結(jié)束。⑤data[start:stop:step]:用于獲取從下標start開始到下標stop停止(不包括stop),間隔為step的子數(shù)組。⑥data[::2]:切片中省略start、stop下標,表示下標從0開始到最后一個元素結(jié)束,步長為2。⑦data[:-1]:切片中下標使用負數(shù),表示從數(shù)組最后往前數(shù),-1表示倒數(shù)第一個元素,-3表示倒數(shù)第三個元素。省略start表示下標從0開始到倒數(shù)最后一個元素(不包含最后一個元素)結(jié)束。2.2N維數(shù)組對象ndarray2.多維數(shù)組的索引和切片多維數(shù)組的存取與一維數(shù)組類似,因為多維數(shù)組有多個軸,所以它的下標需要多個值來表示。NumPy采用元組作為數(shù)組的下標(因此a[1,2]與a[(1,2)]相同),每個軸(維度)一個索引值(第一個索引值是第0軸的,第二個索引值是第1軸的),用逗號分隔。圖2-1所示為一個shape為(4,6)的二維數(shù)組。2.2N維數(shù)組對象ndarray2.多維數(shù)組的索引和切片【實例】shape為(5,5)的二維數(shù)組的切片或索引訪問。In[51]:data2=np.array([[0,1,2,3,4],[5,6,7,8,9],[10,11,12,13,14],[15,16,17,18,19],[20,21,22,23,24]])每個軸(維度)一個索引值,中間用逗號分隔。In[52]:data2[2,2]每個軸(維度)取切片,中間用逗號分隔。In[53]:data2[1:3,2:3]負數(shù)表示從后向前數(shù)(-1表示倒數(shù)第一個元素,-3表示倒數(shù)第三個元素)。In[55]:data2[-3:-1,1:2])每個維度可以使用步長跳躍切片。In[56]:data2[:7:2,2:8:3]2.2N維數(shù)組對象ndarray2.多維數(shù)組的索引和切片如果下標元組中只包含整數(shù)下標和切片,那么得到的數(shù)組為原數(shù)組的一個視圖,新數(shù)組與原數(shù)組在內(nèi)存中占用同一內(nèi)存地址。3.slice()函數(shù)和s_切片對象在多維數(shù)組中可以用冒號隔開的兩個或多個切片對象來表示切片,可以使用Python的內(nèi)置函數(shù)slice()來創(chuàng)建切片對象。它有3個參數(shù),分別為初始值、結(jié)束值和步長,當這些值需要省略時可以使用None。例如data1[slice(None,None,2),slice(2,None)]與data1[::2,2:]相同。

#使用Python的內(nèi)置函數(shù)slice()來創(chuàng)建切片對象將下標元組保存起來

index=slice(None,None,2),slice(2,None)data1[index]2.2N維數(shù)組對象ndarray3.slice()函數(shù)和s_切片對象除了使用Python的內(nèi)置函數(shù)slice()創(chuàng)建切片對象外,NumPy還提供了一個s_對象來幫助我們快速創(chuàng)建切片對象。事實上,s_是IndexExpression類的一個對象。s_[::2,2:]與slice(None,None,2)、slice(2,None)是相同的。#使用NumPy的s_對象將下標元組保存起來

index=np.s_[::2,2:]data1[index]2.2N維數(shù)組對象ndarray4.花式索引花式索引(fancyindexing)是指利用整數(shù)數(shù)組進行索引,這里的整數(shù)數(shù)組可以是NumPy數(shù)組,也可以是Python中列表、元組等可迭代類型。花式索引根據(jù)索引整型數(shù)組的值作為目標數(shù)組的某個軸的下標來取值。例如,在data[[0,1,2,3],[1,2,3,4]]中,下標仍然是有兩個元素的元組,兩個元素分別對應(yīng)數(shù)組的第0軸和第1軸。從兩個序列[0,1,2,3]、[1,2,3,4]的對應(yīng)位置取出兩個元素組成下標元組,也就是data[0,1]、data[1,2]、data[2,3]、data[3,4]。而對于在[1,2,3]和[3,4]兩個元素個數(shù)不相等的情況下,是不能拼接成對應(yīng)的下標的。當然得益于NumPy中的廣播機制,如果其中的一個整型數(shù)組只有一個元素可以廣播到與其他整型數(shù)組相同的元素個數(shù),例如[0,1]和[2]兩個整數(shù)數(shù)組,那么NumPy的廣播機制先將[2]變成[2,2],然后拼接成相應(yīng)的下標data[0,2]和data[1,2]。2.2N維數(shù)組對象ndarray更進一步,我們還可以借助切片和索引與花式索引組合,如下面的例子。In[65]:data1=np.array([[1,2,3],[4,5,6],[7,8,9]])a=data1[1:3,[1,2]]b=data1[...,1:]aOut[65]:[[56][89]]In[66]:bOut[66]:[[23][56][89]]2.2N維數(shù)組對象ndarraydata1[1:3,[1,2]]的第0軸的下標是一個切片對象,它選擇第1、2行;第1軸的下標是整數(shù)列表,它選擇第1、2列;因此data1[1:3,[1,2]]選擇的是第1、2行的第1、2列構(gòu)成的數(shù)組,返回的是一個數(shù)組對象。在data1[...,1:]中,第0軸的省略號用來代替冒號([...]與[::]等價),也就是選擇第0、1、2行;第1軸上的切片表示選擇第1、2列;因此data1[...,1:]選擇的是第0、1、2行的第1、2列構(gòu)成的數(shù)組。5.布爾索引我們還可以通過一個布爾索引來進行目標數(shù)組的存取,布爾索引通過布爾運算(如比較運算)來獲取符合指定條件的元素的數(shù)組?!緦嵗揩@取大于5的元素。In[67]:data=np.array([[0,1,2],[3,4,5],[6,7,8],[9,10,11]])print('輸出大于5的元素:')print(data[data>5])【實例】通過布爾數(shù)組來進行數(shù)組的存取。In[68]:bl=np.array([1,0,1,1],dtype=np.bool)data1=np.array([[0,1,2],[3,4,5],[6,7,8],[9,10,11]])data=data1[bl,0:2]2.2N維數(shù)組對象ndarray前面介紹過整數(shù)和切片索引是原數(shù)組的視圖(生成的新數(shù)組與原數(shù)組共享同一內(nèi)存),花式索引、布爾數(shù)組與整數(shù)索引、切片不一樣,前兩者總是將數(shù)據(jù)復(fù)制到新數(shù)組中,因此改變新數(shù)組的值不會影響原數(shù)組。2.2N維數(shù)組對象ndarray2.2.4結(jié)構(gòu)體數(shù)組在NumPy中可以使用dtype()函數(shù)定義一個結(jié)構(gòu)類型,dtype()函數(shù)的參數(shù)是一個描述結(jié)構(gòu)類型各個字段的字典,字典各個鍵的說明如表2-11所示。下面的代碼定義了結(jié)構(gòu)類型student,它包含id、name、age這3個屬性。student=np.dtype({"names":["id","name","age"],"formats":['i4','S30','i1'],"aligned":True})2.2N維數(shù)組對象ndarray結(jié)構(gòu)數(shù)組的存取和普通數(shù)組一樣,可以使用下標進行存取,雖然元素的值看上去像元組,但實際上是結(jié)構(gòu)類型的。In[73]:student=np.dtype({"names":["id","name","age"],"formats":['i4','S30','i1'],"aligned":True})stus=np.array([(201201,'zhangsan',23),(201202,'lisi',23),(201203,'wangwu',23)],dtype=student)stus[0]Out[73]:(201201,b'zhangsan',23)In[74]:stus[0].dtypeOut[74]:{'names':['id','name','age'],'formats':['<i4','S30','i1'],'offsets':[0,4,34],'itemsize':36,'aligned':True}2.2N維數(shù)組對象ndarray2.2.5數(shù)組高級操作1.數(shù)組重塑與轉(zhuǎn)置我們還可以在保證數(shù)組元素個數(shù)不變的條件下,改變數(shù)組每個軸的長度。下面將數(shù)組arr的shape屬性從(2,3)改為(3,2)。data1.shape=(3,2)當某個軸的長度被設(shè)置成-1時,這時將自動計算該軸的長度。例如,將數(shù)組data1的shape屬性設(shè)置為(3,-1),由于數(shù)組data有6個元素,因此shape的屬性實際修改為(3,2)。要想保留原數(shù)組的維度,可以使用reshape()函數(shù),reshape()函數(shù)使得數(shù)組無須復(fù)制元素就能從一個形狀轉(zhuǎn)化為另一個形狀。下面的代碼完成從一個一維數(shù)組轉(zhuǎn)化為一個二維數(shù)組的操作。arr=np.arange(12)arr2=arr.reshape(3,4)2.2N維數(shù)組對象ndarray與reshape()函數(shù)類似,實現(xiàn)數(shù)組重塑的函數(shù)還有flatten()(通常稱為扁平化)和ravel()(通常稱為散開)。這兩個函數(shù)通常將多維數(shù)組轉(zhuǎn)化為一維數(shù)組,而reshape()函數(shù)通常用來將一維數(shù)組轉(zhuǎn)化為多維數(shù)組。這3個函數(shù)也都接受一個表示數(shù)組順序的order參數(shù)。flatten()與ravel()函數(shù)的不同之處是ravel()函數(shù)不會產(chǎn)生源數(shù)據(jù)的副本,flatten()函數(shù)總是返回源數(shù)據(jù)的副本。2.數(shù)組元素重復(fù)NumPy數(shù)組重復(fù)函數(shù)有repeat()和tile(),由于數(shù)組不能進行動態(tài)擴展,故函數(shù)調(diào)用之后都重新分配新的空間來存儲擴展后的數(shù)據(jù)。2.2N維數(shù)組對象ndarray2.數(shù)組元素重復(fù)(1)repeat()函數(shù)功能對數(shù)組中的元素進行連續(xù)重復(fù)復(fù)制,用法有兩種。①repeat(a,repeats,axis=None)。②a.repeat(repeats,axis=None)。其中a為數(shù)組,repeats為重復(fù)的次數(shù),axis表示數(shù)組維度。若axis=None,對于多維數(shù)組而言,可以將多維數(shù)組變化為一維數(shù)組,然后根據(jù)repeats參數(shù)擴充數(shù)組元素;若axis=M,表示數(shù)組在M軸上擴充數(shù)組元素。2.2N維數(shù)組對象ndarray2.數(shù)組元素重復(fù)(2)tile()函數(shù)功能沿指定軸的方向堆疊數(shù)組的副本。用法:tile(a,repeats)。其中a為數(shù)組,repeats為重復(fù)的次數(shù)3.復(fù)制和視圖當對數(shù)組進行操作時,其數(shù)據(jù)有時會被復(fù)制到一個新的數(shù)組而有時又不會復(fù)制。這一點常常給剛使用NumPy的用戶造成困惑。下面分3種情況來講解NumPy中的復(fù)制與視圖。2.2N維數(shù)組對象ndarray3.復(fù)制和視圖(1)完全不復(fù)制簡單的賦值操作不會產(chǎn)生對象,是完全不復(fù)制的;完全不復(fù)制(直接賦值)其實就是對象的引用,不會產(chǎn)生對象的復(fù)制操作。(2)淺復(fù)制(視圖)view操作會創(chuàng)建一個共享原數(shù)組數(shù)據(jù)的新的數(shù)組對象。view操作有很多,如NumPy的view()函數(shù)、slice()函數(shù)、reshape()函數(shù)、ravel()函數(shù)等。淺復(fù)制(視圖)只會復(fù)制父對象,不會復(fù)制底層的數(shù)據(jù),共用原始引用指向的對象數(shù)據(jù)。如果在視圖上修改數(shù)據(jù),會直接反饋到原對象。(3)完全復(fù)制對對象及其子對象都進行復(fù)制,對新生成的對象進行修改、刪除操作不會影響原對象。NumPy的copy()函數(shù)、flatten()函數(shù)等都是完全復(fù)制的。2.2N維數(shù)組對象ndarray4.數(shù)組連接與拆分在進行數(shù)據(jù)處理的時候,會把一些具有多個特征的樣本數(shù)據(jù)進行拼接合并,放在一起分析、預(yù)測。2.2N維數(shù)組對象ndarray4.數(shù)組連接concatenate()函數(shù)可以沿指定軸將一個由數(shù)組組成的序列(列表、元組等)連接在一起,它是連接數(shù)組的最基本的函數(shù),其他函數(shù)都是它的快捷實現(xiàn)。它的第一個參數(shù)是要進行連接的多個數(shù)組的序列,第二個參數(shù)是axis,指定沿著哪個軸連接(默認axis=0)。vstack()函數(shù)中v表示vertical(垂直),也就是沿著0軸連接,實際上它是concatenate的axis=0的快捷操作。hstack()函數(shù)中h表示horizontal(水平),也就是沿著1軸連接,實際上它是concatenate的axis=1的快捷操作。column_stack()與hstack()函數(shù)類似,都是沿著1軸連接,但是當數(shù)組為一維時,將其形狀改為(N,1)后再進行連接,經(jīng)常用于按列連接多個一維數(shù)組。2.2N維數(shù)組對象ndarray4.數(shù)組連接進行連接操作時,連接的幾個數(shù)組除了axis軸外形狀應(yīng)該相同。例如,np.concatenate([arr1,arr2],axis=1)要求arr1和arr2在0軸上維度相同(假如arr1和arr2都是二維數(shù)組),np.concatenate([arr1,arr2],axis=0)要求arr1和arr2在1軸上維度相同,np.vstack([arr1,arr2])要求arr1和arr2在1軸上維度相同,np.hstack([arr1,arr2])要求arr1和arr2在0軸上維度相同,否則無法進行連接。2.2N維數(shù)組對象ndarray4.數(shù)組拆分與連接相對的就是拆分,NumPy數(shù)組可以進行水平、垂直或深度拆分,相關(guān)的函數(shù)有hsplit()、vsplit()、dsplit()和split()。我們可以將數(shù)組拆分成大小相同的子數(shù)組,也可以在原數(shù)組中指定需要拆分的位置。split()函數(shù)沿特定的軸將數(shù)組分割為子數(shù)組,格式如下。np.split(arr,indices_or_sections,axis)參數(shù)說明如下。①arr:被分割的數(shù)組。②indices_or_sections:如果是一個整數(shù),就用該數(shù)平均拆分;如果是一個數(shù)組,為沿軸拆分的位置。③axis:沿著哪個維度(軸向)進行拆分,默認為0,表示橫向切分(水平方向)。設(shè)置為1時,表示縱向切分(垂直方向)。2.2N維數(shù)組對象ndarray4.數(shù)組拆分【實例】indices_or_sections是一個數(shù)組,axis=1表示橫向切分。In[94]:arr1=np.arange(16).reshape(4,4)arr2=np.split(arr1,[1,2],axis=1)上面的例子中,split的indices_or_sections參數(shù)是一個數(shù)組,表示沿軸切分的位置,又因為axis=1說明切分的軸向是“1”,也就是垂直切分,所以np.split(arr1,[1,2],axis=1)將數(shù)組arr1在第一列、第二列處進行切分,也就是將4×4的數(shù)組拆分成4×1(原數(shù)組的第0列)、4×1(原數(shù)組的第1列)、4×2(原數(shù)組的第2、3列)三個子數(shù)組。2.2N維數(shù)組對象ndarray4.數(shù)組拆分當?shù)诙€參數(shù)(indices_or_sections)為整數(shù)時,表示分組個數(shù)。【實例】用split()函數(shù)把4×4矩陣沿axis=0拆分成兩個2×4矩陣。In[95]:arr1=np.arange(16).reshape(4,4)arr2=np.split(arr1,2,axis=0)split()函數(shù)把4×4矩陣進行劃分,當?shù)诙€參數(shù)為3不能平分時,報如下的錯誤。ValueError:arraysplitdoesnotresultinanequaldivision【實例】用array_split()函數(shù)把4×4矩陣進行劃分,且第二個參數(shù)為3時能夠盡量平分。In[96]:arr1=np.arange(16).reshape(4,4)arr2=np.array_split(arr1,3,axis=0)2.2N維數(shù)組對象ndarray通用(ufunc)函數(shù)是一種對ndarray中的數(shù)據(jù)執(zhí)行元素級運算的函數(shù),那什么是元素級的運算呢?其實就是函數(shù)對數(shù)組中的每一個元素值運算然后產(chǎn)生新的元素值,返回新的元素值并組成數(shù)組。用戶可以將其看作簡單函數(shù)(接受一個或多個標量值,并產(chǎn)生一個或多個標量值)的矢量化包裝器。NumPy提供了大量的通用函數(shù),這些函數(shù)都是用C語言來實現(xiàn)的。因此使用這些函數(shù)進行運算的速度比使用循環(huán)或列表推導式要快很多。math庫和NumPy庫中的數(shù)學函數(shù)各有長短,計算100萬次正弦值,np.sin()比math.sin快近30倍。對單個數(shù)的計算math.sin則要比np.sin()快得多了2.3通用函數(shù)NumPy中有眾多的通用函數(shù)提供各種各樣的計算。表2-13和表2-14所示分別為常用的一元通用函數(shù)和二元通用函數(shù)。2.3通用函數(shù)1.算術(shù)運算NumPy為數(shù)組定義了各種數(shù)學運算的操作符,因此兩個數(shù)組的四則運算既可以用操作符來完成,也可以用函數(shù)來完成。表2-15所示為NumPy提供的實現(xiàn)四則運算的通用函數(shù)與運算符的對應(yīng)。2.3通用函數(shù)2.比較運算使用==、>=等比較運算符對兩個數(shù)組進行比較,返回值為一個布爾數(shù)組,布爾數(shù)組的每個值就是兩個數(shù)組對應(yīng)元素比較的結(jié)果。每個比較運算符也與一個通用函數(shù)對應(yīng),表2-16所示為比較運算符與對應(yīng)通用函數(shù)。2.3通用函數(shù)3.邏輯運算Python中的邏輯運算采用and、or和not等關(guān)鍵字,但是對兩個數(shù)組采用and、or和not進行運算會拋出異常,因此,數(shù)組的邏輯運算只能通過相應(yīng)的通用函數(shù)來進行,這些函數(shù)都是以logical_開頭的。logical_and、logical_or、logical_xor(分別等價于邏輯操作與、或、非)進行逐個元素的邏輯操作,返回布爾數(shù)組。NumPy中的any()和all()函數(shù)與Python中的any()和all()函數(shù)類似。只有數(shù)組中的元素全為True時all()函數(shù)才為True,而只要數(shù)組中的元素有一個為True,any()函數(shù)即為True。2.3通用函數(shù)(1)數(shù)組值求和使用NumPy的sum()函數(shù)可以完成數(shù)組值求和運算,當然也可以使用Python內(nèi)置的sum()函數(shù)來求和。(2)最大值和最小值同樣,使用NumPy的max()、min()函數(shù)可以獲取數(shù)組的最大值和最小值,當然也可以使用Python內(nèi)置的max()、min()函數(shù)來求,但是NumPy的max()、min()函數(shù)速度更快一些。2.4聚合函數(shù)(3)多維度聚合一種常用的聚合操作是沿著一行或一列聚合。例如,有如下二維數(shù)組,我們想要統(tǒng)計它的某些聚合信息。data2=np.array([1,2,3],[4,5,6],[7,8,9])默認情況下,每一個NumPy聚合函數(shù)都會返回對整個數(shù)組的聚合結(jié)果,例如data2.sum()函數(shù)得到的是數(shù)組所有元素的求和結(jié)果。聚合函數(shù)還有一個參數(shù)axis,用于指定沿著哪個軸的方向進行聚合。axis參數(shù)指定的是數(shù)組將會被折疊的維度,而不是將要返回的維度。因此,指定axis=0意味著第一個軸將要被折疊,而對于二維數(shù)組,這意味著每一列的值都將被聚合。例如,可以通過指定axis=0找到每一列的最小值,通過axis=1找到每一行的最小值等。數(shù)組名.min(axis=指定軸)數(shù)組名.max(axis=指定軸)2.4聚合函數(shù)除了上面介紹的一些簡單聚合函數(shù)以外,表2-17還列出了其他常用的聚合函數(shù)。NumPy并不支持對缺失值(NaN)的處理。因此,一般的聚合函數(shù)在遇到缺失值NaN時,就會報錯。所以NaN安全版本是指遇到缺失值時,函數(shù)就會跳過,而非報錯。2.4聚合函數(shù)NumPy提供了多種排序函數(shù)。2.5排序函數(shù)1.sort()函數(shù)sort()函數(shù)返回輸入數(shù)組的排序副本,函數(shù)格式如下。np.sort(a,axis,kind,order)參數(shù)說明如下。①a:要排序的數(shù)組。②axis:排序的方向。默認值為axis=-1,表示沿最后的軸排序,axis=None表示展開來排序。如果是二維數(shù)組,axis可選0、1,axis=0表示按列排序,axis=1表示按行排序。③kind:排序的算法,包含quicksort(快速排序)、mergesort(歸并排序)、heapsort(堆排序),默認為quicksort。④order:一個字符串或列表,如果數(shù)組包含字段,則是要排序的字段。2.5排序函數(shù)2.ndarray.sort()函數(shù)ndarray.sort()與sort()函數(shù)功能基本相同,不同之處在于sort()函數(shù)返回排序副本,而ndarray.sort()函數(shù)不需要a參數(shù)且無返回值,也就是說ndarray.sort()函數(shù)在原數(shù)組上進行排序。3.a(chǎn)rgsort()函數(shù)argsort()函數(shù)返回的是數(shù)組元素從小到大排序后所對應(yīng)的索引值,函數(shù)格式如下。np.argsort(a,axis=1,kind='quicksort',order=None)各參數(shù)說明與sort()函數(shù)相同。2.5排序函數(shù)3.a(chǎn)rgsort()函數(shù)In[109]:a=np.arange(6)a+=8np.random.shuffle(a)b=np.argsort(a)print("原數(shù)組=",a)print("argsort后索引",b)Out[109]:

原數(shù)組=[1181391210]argsort后索引[135042]列表b的元素表示的是原列表a中的元素的索引b[0]=1,表示原列表a的最小元素的索引為1,即原列表a中的第二個元素為最小值;b[1]=3,表示原列表a的第二小元素的索引為3,即原列表a中的第四個元素為第二小元素。2.5排序函數(shù)4.lexsort()函數(shù)lexsort()函數(shù)用于對多個序列進行排序,排序時優(yōu)先考慮后面的列。lexsort()函數(shù)返回排序后的索引,數(shù)組中最后的列為主鍵(也就是排序時優(yōu)先考慮后面的列)。函數(shù)格式如下。np.argsort(a,axis=-1,kind='quicksort',order=None)各參數(shù)說明與sort()函數(shù)類似。2.5排序函數(shù)4.lexsort()函數(shù)2.5排序函數(shù)a在前,b在后,即先按照b的元素進行比較,b的元素相同的再按照a的元素進行比較。如b中的最小值為3個80,其索引分別為0、1、3;再比較這3個位置上的a中的元素值分別為zhanga、lia、zhangb,排序后為1、0、3。如b中的次最小值為3個89,其索引分別為2、4、5;再比較這3個位置上的a中的元素值分別為wanga、lib、wangb,排序后為4、2、5。因此返回的c的值為[103425]。5.searchsorted()函數(shù)函數(shù)格式為searchsorted(a,v,side="left",sorter=None),其作用為在數(shù)組a中搜索數(shù)組v,返回一個下標列表,這個列表指明了v中對應(yīng)元素應(yīng)該插入在a中的位置(之所以是應(yīng)該插入,是因為實際上并不執(zhí)行插入操作)。參數(shù)說明如下。①a:輸入數(shù)組。當sorter參數(shù)為None的時候,a必須為升序數(shù)組;否則,sorter不能為空。sorter存放a數(shù)組中元素的index,用于反映a數(shù)組的升序排列方式。②v:插入a數(shù)組的值,可以為單個元素,也可以是列表和數(shù)組。③side:如果是"left",則給出找到的第一個合適位置的索引;如果是"right",則返回合適位置的后一個索引。默認為"left"。當搜索一個元組a中不存在的元素時,side模式不起作用。如果這個元素比a的最小值還小,就返回0;如果比a的最大值還大,就返回數(shù)組a的長度N。side的默認模式為"left"。④sorter:可選的整數(shù)索引數(shù)組,用于按升序?qū)?shù)組a進行排序。它們通常是argsort()函數(shù)的結(jié)果。2.5排序函數(shù)5.searchsorted()函數(shù)函數(shù)格式為searchsorted(a,v,side="left",sorter=None),其作用為在數(shù)組a中搜索數(shù)組v,返回一個下標列表,這個列表指明了v中對應(yīng)元素應(yīng)該插入在a中的位置(之所以是應(yīng)該插入,是因為實際上并不執(zhí)行插入操作)。參數(shù)說明如下。①a:輸入數(shù)組。當sorter參數(shù)為None的時候,a必須為升序數(shù)組;否則,sorter不能為空。sorter存放a數(shù)組中元素的index,用于反映a數(shù)組的升序排列方式。②v:插入a數(shù)組的值,可以為單個元素,也可以是列表和數(shù)組。③side:如果是"left",則給出找到的第一個合適位置的索引;如果是"right",則返回合適位置的后一個索引。默認為"left"。當搜索一個元組a中不存在的元素時,side模式不起作用。如果這個元素比a的最小值還小,就返回0;如果比a的最大值還大,就返回數(shù)組a的長度N。side的默認模式為"left"。④sorter:可選的整數(shù)索引數(shù)組,用于按升序?qū)?shù)組a進行排序。它們通常是argsort()函數(shù)的結(jié)果。2.5排序函數(shù)5.searchsorted()函數(shù)【實例】當搜索的v值在輸入數(shù)組a中時的情況。In[112]:a=[1,4,6,12,56,78,89,90]data1=np.searchsorted(a,90,side="left")data2=np.searchsorted(a,90,side="right")print("data1=",data1)print("data2=",data2)Out[112]:data1=7data2=8由此可知,當v在a中,且side="left"時,函數(shù)searchsorted()返回v在a中的索引;side="right"時,函數(shù)searchsorted()返回v在a中的索引加1。2.5排序函數(shù)5.searchsorted()函數(shù)【實例】當搜索的v不在輸入數(shù)組a中時的情況。In[113]:a=[1,4,6,12,56,78,89,90]#v的值不在a中,且v的值在a的最小值和最大值之間

data1=np.searchsorted(a,7,side="left")data2=np.searchsorted(a,7,side="right")print("data1=",data1)print("data2=",data2)Out[113]:data1=3data2=3

由此可知,當v的值在a中時,函數(shù)searchsorted()返回值與side="left"、side="right"無關(guān),函數(shù)searchsorted()返回v應(yīng)該插入的位置(插入v后a應(yīng)有序,但是并不執(zhí)行插入操作)。2.5排序函數(shù)5.searchsorted()函數(shù)【實例】sorter不等于None時,a可以是無序的,這時sorter是a的排序索引。In[114]:a=[23,45,12,34,36,57,87]index1=np.argsort(a)#index1是a的有序索引數(shù)組

data1=np.searchsorted(a,12,side="left",sorter=index1)data2=np.searchsorted(a,57,side="right",sorter=index1)由此可知,如果a無序,那么sorter不能為None,sorter值必須是a的排序索引數(shù)組。searchsorted()函數(shù)的返回值是v在a排序后的數(shù)組中應(yīng)該插入的位置。2.5排序函數(shù)隨機數(shù)生成函數(shù)應(yīng)用得十分普遍,例如統(tǒng)計抽樣、科學領(lǐng)域的計算機仿真等。andom模塊中提供了大量的隨機數(shù)生成函數(shù),表2-19所示為常用隨機數(shù)生成函數(shù)。表2-20所示為random模塊提供的產(chǎn)生服從各類分布的隨機數(shù)的函數(shù)。2.6隨機數(shù)生成函數(shù)2.6隨機數(shù)生成函數(shù)1.random.uniform()函數(shù)random.uniform()函數(shù)格式如下。np.random.uniform(low=0.0,high=1.0,size=None)該函數(shù)的作用是生成size個符合均勻分布的浮點數(shù),取值范圍為[low,high),默認取值范圍為[0,1.0),可以是單個值,也可以是一維數(shù)組,還可以是多維數(shù)組。參數(shù)說明如下。①low:float型數(shù)值,默認為0。②high:float型數(shù)值,默認為1。③size:int型數(shù)值或元組,默認為空。2.6隨機數(shù)生成函數(shù)2.random.rand()函數(shù)random.rand()函數(shù)格式如下。np.random.rand(d0,d1,…,dn)該函數(shù)的作用是返回一個[0,1)區(qū)間內(nèi)的浮點數(shù),參數(shù)(d0,d1,…,dn)代表維度信息,沒有輸入時,則返回[0,1)區(qū)間內(nèi)的一個隨機實數(shù)。2.6隨機數(shù)生成函數(shù)3.random.randint()函數(shù)random.randint()函數(shù)格式如下。np.random.randint(low,high=None,size=None,dtype='l')該函數(shù)的作用是生成size個整數(shù),取值區(qū)間為[low,high),若沒有輸入?yún)?shù)high,則取值區(qū)間為[0,low)。參數(shù)說明如下。①low:int型數(shù)值,隨機數(shù)的下限,當此值為空時,函數(shù)生成[0,low)區(qū)間內(nèi)的隨機數(shù)。②high:int型數(shù)值,默認為空,隨機數(shù)的上限。③size:int型數(shù)值或元組,可以生成單個隨機數(shù),也可以是多維的隨機數(shù)構(gòu)成的數(shù)組。④dtype:可選'int'和'int32'等,默認為'l'。2.6隨機數(shù)生成函數(shù)4.random.normal()函數(shù)random.normal()函數(shù)格式如下。np.random.normal(loc,scale,size)該函數(shù)的作用是返回符合loc為均值、標準差是scale的符合正態(tài)分布的size個隨機數(shù)。參考說明如下。①loc:float型數(shù)值,概率分布的均值(對應(yīng)著整個分布的中心)。②scale:float型數(shù)值,概率分布的標準差(對應(yīng)于分布的寬度,scale值越大越“矮胖”,scale值越小越“瘦高”)。③size:int型數(shù)值或元組,默認值為None

溫馨提示

  • 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)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論