《數(shù)據(jù)采集與處理:基于python》 課件 第3章-Numpy與Pandas基礎_第1頁
《數(shù)據(jù)采集與處理:基于python》 課件 第3章-Numpy與Pandas基礎_第2頁
《數(shù)據(jù)采集與處理:基于python》 課件 第3章-Numpy與Pandas基礎_第3頁
《數(shù)據(jù)采集與處理:基于python》 課件 第3章-Numpy與Pandas基礎_第4頁
《數(shù)據(jù)采集與處理:基于python》 課件 第3章-Numpy與Pandas基礎_第5頁
已閱讀5頁,還剩53頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第三章

numpy與pandas基礎《數(shù)據(jù)采集與處理:基于Python》2024/5/1112024/5/112教學目標本章學習目標1.了解numpy和pandas的常用數(shù)據(jù)結構、數(shù)據(jù)類型及其用途;2.掌握numpy多維數(shù)組的創(chuàng)建、存取、運算及數(shù)組間的合并、拆分等常見操作;3.理解pandas中Series和DataFrame的特點及與numpy多維數(shù)組的區(qū)別,掌握它們的創(chuàng)建、存取、運算等常用操作方法。本章提綱1、numpy基礎2、pandas基礎numpy基礎2024/5/113為什么選擇numpyPython自身的嵌套列表結構(nestedliststructure)的運行和存儲效率較低,不能適應大規(guī)模的數(shù)值計算、元素操作及矩陣運算等。而numpy模塊則比嵌套列表高效得多,并且支持大量的多維數(shù)組與矩陣運算,針對數(shù)組運算還提供了大量的數(shù)學函數(shù)庫。numpy(即numericPython)的前身為Numeric,最早由JimHugunin與其他協(xié)作者共同開發(fā)。2005年,TravisOliphant在Numeric中結合了另一個同性質的程序庫numarray的特色,并加入了其他擴展,從而開發(fā)了numpy。numpy開放源代碼,并且由許多協(xié)作者共同維護開發(fā)。numpy專為嚴格的數(shù)字處理而生,提供了許多高級的數(shù)值編程工具,如矩陣數(shù)據(jù)類型、矢量處理以及精密的運算庫。numpy多為大型金融公司使用,一些核心的科學計算組織(如LawrenceLivermore、NASA)也用其處理本來使用C、Fortran或Matlab等完成的任務。numpy模塊庫包括一個強大的n維數(shù)組對象array,比較成熟的函數(shù)庫,用于整合C/C和Fortran代碼的工具包,實用的線性代數(shù)、傅里葉變換和隨機數(shù)生成函數(shù)。numpy和稀疏矩陣運算包scipy配合使用會更加方便。2024/5/114numpy數(shù)據(jù)類型numpy支持的數(shù)據(jù)類型比Python內置的數(shù)據(jù)類型多,基本上可以和C語言的數(shù)據(jù)類型對應,其中部分類型對應Python內置的數(shù)據(jù)類型。numpy的數(shù)值類型實際上是dtype對象的實例,并對應唯一的字符,包括np.bool_,32,np.float32等。表3-1列舉了常用的numpy數(shù)據(jù)類型。numpy提供了兩種基本對象:ndarray(n-dimensionalarrayobject)和ufunc(universalfunctionobject)。ndarray(下文統(tǒng)一稱為數(shù)組)是存儲單一數(shù)據(jù)類型的多維數(shù)組,而ufunc則是能夠對數(shù)組進行處理的函數(shù)。2024/5/115名稱描述bool_布爾類型(True或者False)int_默認的整數(shù)類型(類似于C語言中的long、int32或int64)intc與C語言的int類型一樣,一般是int32或int64intp用于索引的整數(shù)類型(類似于C語言中的ssize_t,一般情況下仍然是int32或int64)int8字節(jié)(-128~127)int16整數(shù)(-32768~32767)int32整數(shù)(-2147483648~2147483647)int64整數(shù)(-9223372036854775808~9223372036854775807)uint8無符號整數(shù)(0~255)uint16無符號整數(shù)(0~65535)uint32無符號整數(shù)(0~4294967295)uint64無符號整數(shù)(0~18446744073709551615)float_float64類型的簡寫float16半精度浮點數(shù),包括1個符號位、5個指數(shù)位、10個尾數(shù)位float32單精度浮點數(shù),包括1個符號位、8個指數(shù)位、23個尾數(shù)位名稱描述float64雙精度浮點數(shù),包括1個符號位、11個指數(shù)位、52個尾數(shù)位complex_complex128類型的簡寫,即128位復數(shù)complex64復數(shù),表示雙32位浮點數(shù)(實數(shù)部分和虛數(shù)部分)complex128復數(shù),表示雙64位浮點數(shù)(實數(shù)部分和虛數(shù)部分)數(shù)據(jù)類型ndarray1.ndarray簡介numpy提供了一個n維數(shù)組類型ndarray,它描述了相同類型的items的集合,如圖3-1所示。2024/5/116數(shù)據(jù)類型ndarrayndarray與原生Python列表有很大區(qū)別。首先,如圖3-1所示,ndarray在存儲數(shù)據(jù)時,數(shù)據(jù)與數(shù)據(jù)的地址都是連續(xù)的,這樣就使得批量操作數(shù)組元素時的速度更快。這是因為ndarray中所有元素的類型都是相同的,而Python列表中的元素類型是任意的,所以ndarray在存儲元素時內存可以連續(xù),而原生Python列表只能通過尋址方式找到下一個元素。這雖然導致了在通用性能方面numpy的ndarray不及原生Python列表,但在科學計算中,numpy的ndarray可以省掉很多循環(huán)語句,代碼使用方面比原生Python列表簡單得多。其次,numpy內置了并行運算功能,當系統(tǒng)有多個核心時,若進行某種計算,numpy會自動并行計算。另外,numpy底層使用C語言編寫,數(shù)組中直接存儲對象,而不是存儲對象指針,所以其運算效率遠高于純Python代碼。2024/5/117數(shù)據(jù)類型ndarray2.numpy數(shù)組屬性numpy數(shù)組的維數(shù)稱為秩(rank),秩就是軸(axis)的數(shù)量,即數(shù)組的維度(dimension),一維數(shù)組的秩為1,二維數(shù)組的秩為2,依此類推。在numpy中,每個線性數(shù)組稱為一個軸,即維度。比如,二維數(shù)組相當于兩個一維數(shù)組,其中第一個一維數(shù)組中的每個元素又是一個一維數(shù)組。所以一維數(shù)組就是numpy中的軸,第一個軸相當于底層數(shù)組,第二個軸是底層數(shù)組里的數(shù)組。而軸的數(shù)量——秩就是數(shù)組的維數(shù)。很多時候可以聲明axis。axis=0表示沿著第0軸進行操作,即對每一列進行操作;axis=1表示沿著第1軸進行操作,即對每一行進行操作。numpy數(shù)組中比較重要的ndarray對象屬性如表3-2所示。2024/5/118屬性說明ndarray.ndim秩,即軸的數(shù)量或維度的數(shù)量ndarray.shape數(shù)組的維度,對于矩陣是n行m列ndarray.size數(shù)組元素的總個數(shù),相當于ndarray.shape中n×m的值ndarray.dtypendarray對象的元素類型ndarray.itemsizendarray對象中每個元素的大小,以字節(jié)為單位ndarray.flagsndarray對象的內存信息ndarray.data包含實際數(shù)組元素的緩沖區(qū),由于一般通過數(shù)組的索引獲取元素,所以通常不需要使用這個屬性創(chuàng)建數(shù)組1.通過序列對象創(chuàng)建數(shù)組可以通過給numpy模塊的array函數(shù)傳遞Python的序列對象來創(chuàng)建數(shù)組,如果傳遞的是多層嵌套的序列,將創(chuàng)建多維數(shù)組(例如下面的示例程序中的變量c)。示例程序如下:2024/5/119importnumpyasnp#導入numpy模塊,后面習慣使用別名npa=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]])b#返回結果:array([5,6,7,8])c #返回結果:array([[1,2,3,4],[4,5,6,7],[7,8,9,10]])c.dtype #數(shù)組的元素類型可通過dtype屬性獲得,返回結果:dtype(int32)a.shape#一維數(shù)組,返回結果:(4,)c.shape #二維數(shù)組中,第0軸的長度為3,第1軸的長度為4,返回結果:(3,4)c.shape=4,3#注意,從(3,4)改為(4,3)并不是對數(shù)組進行轉置,而只是改變了每個軸的大小,數(shù)組元素在內存中的位置并沒有改變c #返回結果:array([[1,2,3],[4,4,5],[6,7,7],[8,9,10]])c.shape=2,-1#當某個軸的元素為-1時,將根據(jù)數(shù)組元素的個數(shù)自動計算此軸的長度,因此下面的程序將數(shù)組c的shape改為了(2,6)c #返回結果:array([[1,2,3,4,4,5],[6,7,7,8,9,10]])創(chuàng)建數(shù)組可以使用數(shù)組對象的shape屬性查看或改變數(shù)組的形狀,也可以使用reshape函數(shù)改變數(shù)組的形狀,但數(shù)組對象改變形狀后返回的對象與原數(shù)組共享同一個內存區(qū)域,因此,修改其中任意一個數(shù)組的元素都會同時修改另外一個數(shù)組。示例程序如下:數(shù)組的元素類型可以通過dtype屬性獲得,利用dtype參數(shù)在創(chuàng)建數(shù)組時指定元素的類型。示例程序如下:2024/5/1110d=a.reshape((2,2))#使用數(shù)組的reshape函數(shù)可以創(chuàng)建一個改變了尺寸的新數(shù)組,原數(shù)組的shape保持不變d#返回結果:array([[1,2],[3,4]])a #返回結果:array([1,2,3,4])a[1]=100 #將數(shù)組a的第2個元素改為100d #注意,數(shù)組d中的2也被改變了,返回結果:array([[1,100],[3,4]])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ù)組2.通過特定函數(shù)創(chuàng)建數(shù)組上面的例子都是先創(chuàng)建一個Python序列,然后通過array函數(shù)將其轉換為數(shù)組,這樣做的效率顯然不高。因此,numpy提供了很多專門用來創(chuàng)建數(shù)組的函數(shù),也可以創(chuàng)建指定形狀和類型的數(shù)組,如表3-3所示。此外,zeros_like、ones_like、empty_like等函數(shù)可創(chuàng)建與參數(shù)數(shù)組的形狀及類型相同的數(shù)組。因此,“zeros_like(a)”和“zeros(a.shape,a.dtype)”的效果相同。還可以使用frombuffer、fromstring、fromfile、fromfunction等函數(shù),從字節(jié)序列、文件中創(chuàng)建數(shù)組。2024/5/1111函數(shù)功能說明示例arange類似于Python的range函數(shù),通過指定起始值、終值和步長來創(chuàng)建一維數(shù)組,注意,數(shù)組不包括終值np.arange(0,1,0.1)linspace通過指定起始值、終值和元素個數(shù)來創(chuàng)建一維數(shù)組,可以通過endpoint關鍵字指定是否包括終值,缺省設置是包括終值np.linspace(0,1,10):步長為1/9logspace和linspace類似,不過它創(chuàng)建等比數(shù)列np.logspace(0,2,20):產(chǎn)生1(100)~100(102)、有20個元素的等比數(shù)列zeros創(chuàng)建指定形狀、數(shù)值為0的數(shù)組np.zeros(4,np.float)ones創(chuàng)建指定形狀、數(shù)值為1的數(shù)組np.ones(6,np.float)empty創(chuàng)建指定形狀的空數(shù)組,只分配內存,不對其進行初始化np.empty((2,3),)數(shù)組切片與檢索1.一維數(shù)組存取同字符串和列表對象一樣,可以通過下標和切片的方式存取numpy數(shù)組。示例程序如下:2024/5/1112a=np.arange(10)a[5]#用整數(shù)作為下標可以獲取數(shù)組中的某個元素,返回結果:5a[3:5] #用范圍作為下標可以獲取數(shù)組的切片,包括a[3]但不包括a[5],左閉右開,返回結果:array([3,4])a[:5] #省略開始下標,表示從a[0]開始,返回結果:array([0,1,2,3,4])a[:-1] #下標可以使用負數(shù),表示數(shù)組從后往前數(shù),返回結果:array([0,1,2,3,4,5,6,7,8])a[2:4]=100,101 #下標可以用來修改元素的值a #返回結果:array([0,1,100,101,4,5,6,7,8,9])a[1:-1:2] #范圍中的第3個參數(shù)表示步長,2表示隔一個元素取一個元素,返回結果:array([1,101,5,7])a[::-1] #省略范圍的開始下標和結束下標,步長為-1,整個數(shù)組頭尾顛倒,返回結果:array([9,8,7,6,5,4,101,100,1,0])a[5:1:-2] #步長為負數(shù)時,開始下標須大于結束下標,返回結果:array([5,101])數(shù)組切片與檢索與Python的列表序列不同,通過下標范圍獲取的新數(shù)組是原始數(shù)組的一個視圖,它與原始數(shù)組共享數(shù)據(jù)空間。示例程序如下:2024/5/1113b=a[3:7]

#通過下標范圍產(chǎn)生一個新的數(shù)組b,b和a共享數(shù)據(jù)空間b #返回結果:array([101,4,5,6])b[2]=-10 #將b的第2個元素修改為-10b #返回結果:array([101,4,-10,6])a #a的第5個元素也被修改為10,返回結果:array([0,1,100,101,4,-10,6,7,8,9])數(shù)組切片與檢索除了使用下標范圍存取元素之外,numpy還提供了兩種存取元素的高級方法。(1)使用整數(shù)序列。當使用整數(shù)序列對數(shù)組元素進行存取時,將使用整數(shù)序列中的每個元素作為下標,整數(shù)序列可以是列表或者數(shù)組。使用整數(shù)序列作為下標獲得的數(shù)組不和原始數(shù)組共享數(shù)據(jù)空間。(2)使用布爾數(shù)組。當使用布爾數(shù)組b作為下標存取數(shù)組x中的元素時,將收集數(shù)組x中所有在數(shù)組b中對應下標為True的元素。使用布爾數(shù)組作為下標獲得的數(shù)組不和原始數(shù)組共享數(shù)據(jù)空間。注意,這種方式只對應于布爾數(shù)組,不能使用布爾列表。示例程序如下:2024/5/1114x=np.arange(10,1,-1)x

#返回結果:array([10,9,8,7,6,5,4,3,2])x[[3,3,1,8]]

#獲取x中下標為3,3,1,8的4個元素,返回結果:array([7,7,9,2])b=x[np.array([3,3,-3,8])]

#下標可以是負數(shù)b[2]=100b

#返回結果:array([7,7,100,2])x

#b和x不共享空間,因此x值并沒有改變,返回結果:array([10,9,8,7,6,5,4,3,2])x[[3,5,1]]=-1,-2,-3

#整數(shù)序列的下標也可以用來修改元素的值x

#返回結果:array([10,-3,8,-1,6,-2,4,3,2])x=np.arange(5,0,-1)x

#返回結果:array([5,4,3,2,1])x[np.array([True,False,True,False,False])]

#布爾數(shù)組中下標為0,2的元素為True,因此獲取x中下標為0,2的元素,返回結果:array([5,3])x[[True,False,True,False,False]]

#如果是布爾列表,則把True當作1,False當作0,按照整數(shù)序列方式獲取x中的元素,返回結果:array([4,5,4,5,5])x[np.array([True,False,True,True,False])]=-1,-2,-3

#布爾數(shù)組也可以用來修改元素x

#返回結果:array([-1,4,-2,-3,1])數(shù)組切片與檢索2.多維數(shù)組存取多維數(shù)組的存取和一維數(shù)組類似,但多維數(shù)組有多個軸,因此它的下標需要用多個值來表示,numpy采用元組作為數(shù)組的下標。雖然在Python中經(jīng)常用圓括號將元組括起來,但其實元組的語法定義只需要用逗號隔開即可,例如,x,y=y,x就是用元組交換變量值的一個例子。如圖3-2所示,創(chuàng)建數(shù)組a=np.arange(0,60,10).reshape(-1,1)+np.arange(0,6),a為一個6×6的數(shù)組,圖中用描框的顏色深淺區(qū)分了各個下標及其對應的選擇區(qū)域。多維數(shù)組同樣也可以使用整數(shù)序列和布爾數(shù),如圖3-3所示。2024/5/1115數(shù)組切片與檢索●a[(0,1,2,3,4),(1,2,3,4,5)]:用于存取數(shù)組的下標和有兩個元素的元組,元組中的每個元素都是整數(shù)序列,分別對應數(shù)組的第0軸和第1軸。從兩個序列的對應位置取出兩個整數(shù)組成下標:a[0,1],a[1,2],…,a[4,5]?!馻[3:,[0,2,5]]:下標中的第0軸是一個范圍,它選取第3行及之后所有行;第1軸是整數(shù)序列,它選取第0、2、5三列?!馻[mask,2]:下標的第0軸是一個布爾數(shù)組,它選取第0、2、5行;第1軸是一個整數(shù),選取第2列。2024/5/1116numpy數(shù)組運算(一)ufunc運算簡介為方便數(shù)組的批量運算,numpy內置了許多通用的函數(shù)(ufunc),能對數(shù)組的每個元素進行操作,這些ufunc函數(shù)都是用C語言實現(xiàn)的,因此它們的計算速度非???。例如:sinx計算之后,x中的值并沒有改變,而是新創(chuàng)建了一個數(shù)組保存結果。如果希望將sin函數(shù)計算的結果直接覆蓋到數(shù)組x上,可以將要被覆蓋的數(shù)組作為第2個參數(shù)傳遞給ufunc函數(shù)。通常情況下,numpy.sin對數(shù)組的計算速度要比math.sin函數(shù)快5~10倍,因為numpy.sin為了同時支持數(shù)組和單個數(shù)值的計算,其C語言的內部實現(xiàn)要比math.sin復雜得多。numpy.sin同樣也支持對單個數(shù)值求正弦,不過對單個數(shù)值的計算,math.sin要比numpy.sin快得多。2024/5/1117#對數(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])>>>t=np.sin(x,x)>>>tarray([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)Truenumpy數(shù)組運算numpy中有眾多的ufunc函數(shù),提供了各種各樣的計算,如四則運算、比較和布爾運算等。示例程序如下:2024/5/1118a=np.arange(0,4)a#返回結果:array([0,1,2,3])b=np.arange(1,5)b #返回結果:array([1,2,3,4])np.add(a,b) #返回結果:array([1,3,5,7])np.add(a,b,a) #第3個參數(shù)指定計算結果所要寫入的數(shù)組,如果指定的話,add函數(shù)就不再產(chǎn)生新的數(shù)組,返回結果:array([1,3,5,7])np.array([1,2,3])<np.array([3,2,1]) #返回結果:array([True,False,False])numpy數(shù)組運算1.四則運算由于Python的操作符重載功能,計算兩個數(shù)組相加可以簡單地寫為a+b,而np.add(a,b,a)則可以用a+=b來表示。下面是數(shù)組的運算符及其對應的ufunc函數(shù)的一個列表,注意,除號“/”的意義根據(jù)是否激活__future__.division有所不同。(1)y=x1+x2:add(x1,x2[,y])。(2)y=x1-x2:subtract(x1,x2[,y])。(3)y=x1*x2:multiply(x1,x2[,y])。(4)y=x1/x2:divide(x1,x2[,y]),如果兩個數(shù)組的元素為整數(shù),那么用整數(shù)除法。(5)y=x1/x2:truedivide(x1,x2[,y]),總是返回精確的商。(6)y=x1//x2:floordivide(x1,x2[,y]),總是對返回值取整。(7)y=-x:negative(x[,y])。(8)y=x1**x2:power(x1,x2[,y])。(9)y=x1%x2:remainder(x1,x2[,y]),mod(x1,x2,[,y])。2024/5/1119numpy數(shù)組運算2.比較和布爾運算使用“==”“>”等比較運算符對兩個數(shù)組進行比較,將返回一個布爾數(shù)組,它的每個元素值都是兩個數(shù)組對應元素的比較結果,而且每個比較運算符也與一個ufunc函數(shù)對應。示例程序如下:2024/5/1120np.array([1,2,3])<np.array([3,2,1])#返回結果:array([True,False,False],dtype=bool)y=x1==x2#equal(x1,x2[,y])y=x1!=x2 #not_equal(x1,x2[,y])y=x1<x2 #less(x1,x2,[,y])y=x1<=x2 #less_equal(x1,x2,[,y])y=x1>x2 #greater(x1,x2,[,y])y=x1>=x2 #greater_equal(x1,x2,[,y])numpy數(shù)組運算由于Python中的布爾運算使用and、or和not等關鍵字,它們無法被重載,因此數(shù)組的布爾運算只能通過相應的ufunc函數(shù)進行,這些函數(shù)名都以“l(fā)ogical_”開頭。另外,可以使用數(shù)組的any或all函數(shù),只要數(shù)組中有一個值為True,any就返回True;只有數(shù)組的全部元素都為True,all才返回True。示例程序如下:2024/5/1121a=np.arange(5)b=np.arange(4,-1,-1)a==b#返回結果:array([False,False,True,False,False],dtype=bool)a>b #返回結果:array([False,False,False,True,True],dtype=bool)np.logical_or(a==b,a>b)#與a>=b相同,返回結果:array([False,False,True,True,True],dtype=bool)np.any(a==b) #返回結果:Truenp.any(a==b)andnp.any(a>b) #返回結果:Truenumpy數(shù)組運算(二)廣播當使用ufunc函數(shù)對兩個數(shù)組進行計算時,ufunc函數(shù)會對這兩個數(shù)組的對應元素進行計算,因此它要求這兩個數(shù)組有相同的大小,即shape相同。如果兩個數(shù)組的大小不同,會進行如下的廣播(broadcasting)處理:(1)讓所有輸入數(shù)組都向其中長度最長的數(shù)組看齊,長度不足的部分都通過在前面加1補齊。(2)輸出數(shù)組的長度是輸入數(shù)組長度在各個軸上的最大值。(3)如果輸入數(shù)組的某個軸和輸出數(shù)組的對應軸的長度相同或者其長度為1,這個數(shù)組就能夠用來計算,否則出錯。(4)若輸入數(shù)組的某個軸的長度為1,則沿著此軸運算時都用此軸上的第一組值。2024/5/1122numpy數(shù)組運算例如:2024/5/1123>>>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,)>>>c=a+b

#計算a,b中所有元素組的和,得到一個shape為(6,5)的數(shù)組>>>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)numpy數(shù)組運算由于數(shù)組a和數(shù)組b的長度(即ndim屬性)不同,根據(jù)規(guī)則(1),需要讓數(shù)組b的長度向數(shù)組a看齊,于是在數(shù)組b的長度前面加1,補齊為(1,5)。相當于做了如下計算:b.shape=(1,5)。這樣加法運算的兩個輸入數(shù)組的長度分別為(6,1)和(1,5),根據(jù)規(guī)則(2),輸出數(shù)組的各個軸的長度為輸入數(shù)組各個軸上長度的最大值,可知輸出數(shù)組的長度為(6,5)。由于數(shù)組b第0軸的長度為1,而數(shù)組a第0軸的長度為6,因此,為了讓它們在第0軸上能夠相加,需要將數(shù)組b第0軸的長度擴展為6,這相當于如下代碼:2024/5/1124>>>b=b.reshape(1,-1).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]])numpy數(shù)組運算由于數(shù)組a第1軸的長度為1,而數(shù)組b第1軸的長度為5,因此,為了讓它們在第1軸上能夠相加,需要將數(shù)組a第1軸的長度擴展為5,這相當于如下代碼:經(jīng)過上述處理之后,數(shù)組a和數(shù)組b就可以按對應元素進行相加運算了。numpy在執(zhí)行a+b運算時,其內部并不會真正將長度為1的軸用repeat函數(shù)進行擴展,因為這樣做太浪費空間了。由于這種廣播計算很常用,因此numpy提供了一種快速產(chǎn)生如上面a、b數(shù)組的方法:ogrid對象。示例程序如下:2024/5/1125>>>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]])>>>x,y=np.ogrid[0:5,0:5]>>>xarray([[0], [1], [2], [3], [4]])>>>yarray([[0,1,2,3,4]])numpy數(shù)組運算(三)ufunc其他方法ufunc函數(shù)本身還有一些方法,這些方法只對有兩個輸入、一個輸出的ufunc函數(shù)有效,其他ufunc對象調用這些方法時會拋出ValueError異常。reduce方法和Python的reduce函數(shù)類似,它會對參數(shù)序列中的元素進行累積,沿著軸對數(shù)組進行操作。accumulate方法和reduce方法類似,只是它返回的數(shù)組和輸入數(shù)組的長度相同,并保存所有的中間計算結果。示例程序如下:2024/5/1126>>>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])>>>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]])numpy數(shù)組運算outer方法支持數(shù)組乘法,規(guī)則是:(1)對于多維向量,全部展開成一維向量;(2)第1個參數(shù)表示倍數(shù),使得第2個向量每次變?yōu)閹妆?(3)第1個參數(shù)確定結果的行,第2個參數(shù)確定結果的列。示例程序如下:2024/5/1127>>>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]])numpy數(shù)組拼接合并Python中,numpy數(shù)組的合并有很多方法,如append、concatenate、stack、hstack、vstack、dstack等,其中最廣泛使用的是append和concatenate。append可讀性好,比較靈活,但是占用內存大。concatenate則不存在內存占用大的問題。假設有兩個數(shù)組a,b,分別為a=np.arange(0,9).reshape(3,3)和b=2*a,下面給出各類操作示例。1.水平合并2024/5/1128>>>np.hstack((a,b))array([[0,1,2,0,2,4],[3,4,5,6,8,10],[6,7,8,12,14,16]])>>>np.concatenate((a,b),axis=1)array([[0,1,2,0,2,4],[3,4,5,6,8,10],[6,7,8,12,14,16]])numpy數(shù)組拼接合并2.垂直合并3.深度合并:沿著縱軸方向合并2024/5/1129>>>np.vstack((a,b))array([[0,1,2],[3,4,5],[6,7,8],[0,2,4],[6,8,10],[12,14,16]])>>>np.concatenate((a,b),axis=0)array([[0,1,2],[3,4,5],[6,7,8],[0,2,4],[6,8,10],[12,14,16]])>>>np.dstack((a,b))array([[[0,0], [1,2], [2,4]], [ [3,6], [4,8], [5,10]], [ [6,12], [7,14], [8,16]]])numpy數(shù)組拼接合并4.其他合并其他合并方法有:列合并column_stack,對于一維數(shù)組是按列方向合并,對于二維數(shù)組則同hstack一樣;行合并row_stack,對于一維數(shù)組是按行方向合并,對于二維數(shù)組則與vstack一樣;另外,還有extend方法、直接相加“+”、flatten方法等。2024/5/1130numpy矩陣運算numpy與Matlab軟件不同,對于多維數(shù)組的運算,缺省情況下并不使用矩陣運算,如果希望對數(shù)組進行矩陣運算,可以調用相應的函數(shù)。numpy庫提供了matrix類,使用matrix類可創(chuàng)建矩陣對象,它們的加、減、乘、除運算缺省,采用矩陣方式計算,因此用法和Matlab十分類似。但是由于numpy中同時存在ndarray和matrix對象,用戶很容易將兩者混淆,這有違Python的“顯式優(yōu)于隱式”的原則,因此并不推薦在較復雜的程序中使用matrix。下面的代碼是使用matrix的一個示例。a是用matrix創(chuàng)建的矩陣對象,因此乘法和冪運算符都變成了矩陣運算。計算矩陣a和其逆矩陣的乘積,結果是一個單位矩陣。2024/5/1131>>>a=np.matrix([[1,2,3],[5,5,6],[7,9,9]])>>>a*a**-1matrix([[1.00000000e+00,1.66533454e-16,-1.11022302e-16],[0.00000000e+00,1.00000000e+00,-4.44089210e-16],[4.44089210e-16,5.55111512e-17,1.00000000e+00]])numpy矩陣運算矩陣的乘積可以使用dot函數(shù)進行計算。對于二維數(shù)組,它計算的是矩陣乘積;對于一維數(shù)組,它計算的是其點積。當需要將一維數(shù)組當作列矢量或者行矢量進行矩陣運算時,推薦先使用reshape函數(shù)將一維數(shù)組轉換為二維數(shù)組。示例程序如下:2024/5/1132>>>a=np.array([1,2,3])>>>a.reshape((-1,1))array([[1], [2], [3]])>>>a.reshape((1,-1))array([[1,2,3]])numpy矩陣運算除了使用dot函數(shù)計算乘積之外,numpy還提供了inner和outer等多種計算乘積的函數(shù)。這些函數(shù)計算乘積的方式不同,尤其是對于多維數(shù)組,更容易混淆。(1)dot函數(shù)。對于兩個一維數(shù)組,計算的是這兩個數(shù)組對應下標元素的乘積和(數(shù)學上稱為內積);對于兩個二維數(shù)組,計算的是兩個數(shù)組的矩陣乘積;對于兩個多維數(shù)組,結果數(shù)組中的每個元素都是數(shù)組a的最后一維上的所有元素與數(shù)組b的倒數(shù)第二維上的所有元素的乘積和。通用計算公式如下:dot(a,b)[i,j,k,m]=sum(a[i,j,:]*b[k,:,m])(2)inner函數(shù)。和dot函數(shù)一樣,對于兩個一維數(shù)組,計算的是這兩個數(shù)組對應下標元素的乘積和;對于兩個多維數(shù)組,結果數(shù)組中的每個元素都是數(shù)組a和b的最后一維上元素的內積,因此數(shù)組a和b的最后一維的長度必須相等。通用計算公式如下:inner(a,b)[i,j,k,m]=sum(a[i,j,:]*b[k,m,:])(3)outer函數(shù)。只按照一維數(shù)組進行計算,如果傳入的參數(shù)是多維數(shù)組,則先將此數(shù)組展平為一維數(shù)組,之后再進行運算。outer函數(shù)計算的是列向量和行向量的矩陣乘積。矩陣中一些更高級的運算可以在numpy的線性代數(shù)子庫linalg中找到。例如,inv函數(shù)計算逆矩陣,solve函數(shù)求解多元一次方程組。2024/5/1133pandas基礎2024/5/1134為什么選擇pandaspandas是基于numpy的一種工具,該工具是為解決數(shù)據(jù)分析任務而創(chuàng)建的。pandas納入了大量庫和一些標準的數(shù)據(jù)模型,提供了高效地操作大型數(shù)據(jù)集所需的工具、函數(shù)和方法,是使Python成為強大而高效的數(shù)據(jù)分析環(huán)境的重要因素之一。pandas是Python的一個數(shù)據(jù)分析包,最初由AQRCapitalManagement于2008年4月開發(fā),并于2009年底開源。pandas最初被作為金融數(shù)據(jù)分析工具開發(fā)出來,因此,pandas為時間序列分析提供了很好的支持。pandas的名稱來自面板數(shù)據(jù)(paneldata)和Python數(shù)據(jù)分析(dataanalysis)。paneldata是經(jīng)濟學中關于多維數(shù)據(jù)集的一個術語,pandas中也提供了panel這一數(shù)據(jù)類型。2024/5/1135pandas的數(shù)據(jù)結構pandas提供的數(shù)據(jù)結構包括:●Series:一維數(shù)組,與numpy中的一維array類似。二者與Python基本的數(shù)據(jù)結構list也很相近。Series能保存不同數(shù)據(jù)類型的數(shù)據(jù),字符串、布爾值、數(shù)字等都能保存在Series中?!馮ime-Series:以時間為索引的Series?!馜ataFrame:二維表格型數(shù)據(jù)結構。很多功能與R語言中的data.frame類似??梢詫ataFrame理解為Series的容器?!駊anel:三維數(shù)組,可以理解為DataFrame的容器?!馪anel4D:像Panel一樣的四維數(shù)據(jù)容器?!馪anelND:擁有factory集合,可以創(chuàng)建像Panel4D一樣的N維數(shù)據(jù)容器的模塊。(1)Series。Series(系列)是一維標記數(shù)組,可以存儲任意數(shù)據(jù)類型,如整型、字符串、浮點型和Python對象等,軸標一般指索引。Series與numpy一維array及l(fā)ist比較:list中的元素可以是不同的數(shù)據(jù)類型,而array和Series中只允許存儲相同的數(shù)據(jù)類型,這樣可以更有效地使用內存,提高運算效率。2024/5/1136pandas的數(shù)據(jù)結構(2)DataFrame。DataFrame(數(shù)據(jù)框)是二維表格型數(shù)據(jù)結構,列可以是不同的數(shù)據(jù)類型。它是最常用的pandas對象,像Series一樣可以接收多種輸入:list、dict、Series和DataFrame等。初始化對象時,除了數(shù)據(jù),還可以傳入index和columns這兩個參數(shù)。(3)panel。panel很少使用,但它是很重要的三維數(shù)據(jù)容器。paneldata源于經(jīng)濟學,也是pan(el)-da(ta)-s的來源。安裝方式:pipinstallpanel。約定俗成的導入慣例如下所示:2024/5/1137frompandasimportSeries,DataFrameimportpandasaspdSeries相關操作1.創(chuàng)建Series通過傳遞一個list對象來創(chuàng)建Series,默認創(chuàng)建整型索引。如創(chuàng)建一個用索引來確定每個數(shù)據(jù)點的Series:如果有數(shù)據(jù)在一個Python字典中,可以通過傳遞字典來創(chuàng)建一個Series,例如:2.存取元素Series對象可以通過索引標簽或者整數(shù)下標的標量或序列檢索元素,還可以通過布爾數(shù)組過濾、純量乘法或使用數(shù)學函數(shù)來進行檢索和計算。2024/5/1138obj1=pd.Series([6,7,-5,3],index=[d,b,a,c])sdata={北京:2188,上海:2489,深圳:1768,杭州:1237,廈門:800}obj2=pd.Series(sdata)Series相關操作示例程序如下:2024/5/1139In[51]:obj1=pd.Series([4,7,-5,3],index=[d,b,a,c])In[52]:obj1Out[52]:d4b7a-5c3dtype:int64In[53]:obj1[d]=6...:obj1[[c,a,d]]Out [53]:c3a-5d6dtype:int64In [54]:obj1[a]Out [54]:-5In [55]:print(obj1[obj2>0])...:print(obj1*2)d6b7c3dtype:int64d12b14a-10c6dtype:int64In [56]:obj1[0]Out [56]:6Series相關操作3.運算與對齊Series的一個重要功能是,在算術運算中,它會自動對齊不同索引的數(shù)據(jù),即行或列中標簽一致的對應元素進行運算,沒有對應的則為NaN。示例程序如下:2024/5/1140In[11]:sdata={北京:2188,上海:2489,深圳:1768,杭州:1237,廈門:800}...:obj2=pd.Series(sdata)In [12]:省=[北京,上海,深圳,杭州]...:obj3=pd.Series(sdata,index=省)...:obj3Out [12]:北京2188上海2489深圳1768杭州1237dtype:int64In[13]:obj2+obj3Out[13]:上海4978.0北京4376.0廈門NaN杭州2474.0深圳3536.0dtype:float64Series相關操作4.修改與檢測在pandas中,用函數(shù)isnull和notnull來檢測數(shù)據(jù)是否丟失,如pd.isnull(obj4),pd.notnull(obj4)。Series也提供了這些函數(shù)的實例方法,如obj4.isnull()。從坐標軸刪除條目,drop函數(shù)將會返回一個新的對象并從坐標軸中刪除指定的一個或多個值,如果設置參數(shù)“inplace=True”,則修改對象本身,沒有返回值。示例程序如下:2024/5/1141In[14]:obj=pd.Series(np.arange(5.),index=[a,b,c,d,e])...:print(obj)a0.0b1.0c2.0d3.0e4.0dtype:float64In[15]:new_obj=obj.drop(c)...:print(new_obj)...:obj.drop([d,c])a0.0b1.0d3.0e4.0dtype:float64Out[15]:a0.0b1.0e4.0dtype:float64Series相關操作Series對象本身和它的索引都有一個name屬性,它和pandas的其他一些關鍵功能整合在一起,Series對象及其索引可以通過name屬性命名。示例程序如下:5.其他方法Series對象還自帶了其他方法,可以進行數(shù)值統(tǒng)計、字符串處理等,如value_counts、str.lower等函數(shù)。2024/5/1142In[16]:=人口...:=省份...:obj4Out [16]:省份北京2188上海2489深圳1768杭州1237Name:人口,dtype:int64DataFrame相關操作創(chuàng)建DataFrame的方法有多種,如:(1)通過傳遞一個numpyarray、時間索引以及列標簽來創(chuàng)建一個DataFrame。(2)通過使用一個相等長度列表的字典來創(chuàng)建一個DataFrame:●它的索引會自動分配,并且對列進行了排序?!袢绻O定了一個列的順序,DataFrame的列將會精確地按照所傳遞的順序排列。通過一個嵌套的字典格式創(chuàng)建DataFrame,外部鍵會被解釋為列索引,內部鍵會被解釋為行索引,內部字典的鍵被結合并排序以形成結果的索引。示例程序如下:2024/5/1143:{2000:1.5,2001:1.7,2002:3.6}}In[21]:frame1=pd.DataFrame(pop)...:frame1Out[21]:

深圳上海2001

2.4

1.72002

2.9

3.62000

NaN

1.5DataFrame相關操作2.DataFrame檢索DataFrame中的一列可以通過字典記法或屬性來檢索,返回的Series里包含和DataFrame相同的索引。示例程序如下:2024/5/1144In[21]:data={省份:[北京,上海,上海,深圳,深圳,深圳],...:year:[2000,2001,2002,2001,2002,2003],...:pop:[1.5,1.7,3.6,2.4,2.9,3.2]}In[22]:frame2=pd.DataFrame(data,columns=[year,省份,pop,debt],index=[one,two,three,four,five,six])...:print(frame2)...:frame2.columnsyear省份popdebtone 2000 北京 1.5 NaNtwo 2001 上海 1.7 NaNthree 2002 上海 3.6 NaNfour 2001 深圳 2.4 NaNfive 2002 深圳 2.9 NaNsix 2003 深圳 3.2 NaNOut[22]:Index([year,省份,pop,debt],dtype=object)In[23]:print(frame2[省份])...:frame2.yearone北京two 上海three 上海four 深圳five 深圳six 深圳Name:省份,dtype:objectOut[23]:one2000two 2001three 2002four 2001five 2002six 2003Name:year,dtype:int64DataFrame相關操作使用loc和iloc方法(嚴格來講是DataFrame對象屬性),分別按照標簽名稱和索引編號檢索元素。注意:Python2.x中的ix索引方式將逐漸在Python3.x版本中移除?!駆oc方法檢索格式:loc[索引標簽名稱序列,列標簽名稱序列],使用的不是圓括號,不像函數(shù),而類似數(shù)組的使用方式。如frame2.loc[three]?!駃loc方法檢索格式:[索引編號序列,列編號序列]?!馜ataFrame對象還支持布爾序列檢索方式,如data[data[three]>5]。示例程序如下:2024/5/1145In[24]:data=pd.DataFrame(np.arange(16).reshape((4,4)),...: index=[北京,上海,武漢,杭州],...: columns=[one,two,three,four])...:print(data)...:data[two]...:data[[three,one]]onetwothreefour北京 0 1 2 3上海 4 5 6 37武漢 8 9 10 11杭州 12 13 14 15Out[24]:threeone北京 2 0上海 6 4武漢 10 8杭州 14 12DataFrame相關操作2024/5/1146In[25]:print(data[:2])...:data[data[three]>5]onetwothreefour北京 0 1 2 3上海 4 56 37 Out[25]:onetwothreefour上海 4 5 6 7武漢 8 9 10 11杭州 12 13 14 15In[26]:data.loc[北京,[two,three]]Out[26]:two1three2Name:北京,dtype:int32In[27]:data.iloc[2,[3,0,1]]Out[27]:four11one8two9Name:武漢,dtype:int32DataFrame相關操作3.DataFrame賦值DataFrame的列可以通過賦值來修改,索引對象不能修改。例如,空的“debt”列可以通過一個純量或一個數(shù)組來賦值;但通過列表或數(shù)組給一列賦值時,所賦的值的長度必須和DataFrame的長度相匹配。使用Series賦值時,它會代替在DataFrame中精確匹配的索引的值,并在所有的空洞插入丟失數(shù)據(jù)NaN;給一個不存在的列賦值時,將會創(chuàng)建一個新的列。4.算術運算pandas最重要的特性之一是在具有不同索引的對象間進行算術運算。當把對象相加時,如果有任何索引對不相同,則在結果中將會把各自的索引聯(lián)合起來。示例程序如下:2024/5/1147df1=pd.DataFrame(np.arange(12.).reshape((3,4)),columns=list(abcd))df2=pd.DataFrame(np.arange(20.).reshape((4,5)),columns=list(abcde))df2.loc[1,b]=np.nanprint(df1)df2df1+df2DataFrame相關操作運行結果如下:

在不同索引對象間進行算術運算時,若一個軸標簽在另一個對象中找不到,可以填充一個特定的值,如0。示例程序如下:2024/5/1148df1df2df1+df2

df1.reindex(columns=df2.columns,fill_value=0)df1DataFrame相關操作5.刪除對于DataFrame對象,可以從任何坐標軸刪除索引值,也可以像字典一樣,使用“del+關鍵字”刪除列。對應的drop函數(shù),缺省刪除對應行,即索引標簽axis=0;指定axis=1或axis=columns,表示刪除整列;drop函數(shù)返回刪除后的結果,缺省則不對原對象進行修改,參數(shù)inplace用于指定是否修改原對象。示例程序如下:2024/5/1149In[29]:data.drop([北京,上海],inplace=True)In[30]:dataOut[30]:onetwothreefour武漢891011杭州12131415In[31]:data.drop(two,axis=1)...:data.drop([four],axis=columns)Out[31]:onetwothree武漢8910杭州121314In[32]:dataOut[32]:onetwothreefour武漢891011杭州12131415In[34]:frame2[eastern]=frame2.省份==上海...:frame2Out[34]:year省份popdebteasternone 2000 北京 1.5 NaN Falsetwo 2001 上海 1.7 NaN Truethree 2002 上海 3.6 NaN Truefour 2001 深圳 2.4 NaN Falsefive 2002 深圳 2.9 NaN Falsesix 2003 深圳 3.2 NaN FalseIn[35]:delframe2[eastern]...:frame2.columnsOut[35]:Index([year,省份,pop,debt],dtype=object)DataFrame相關操作6.DataFrame和Series之間的運算DataFrame和Series間的運算操作與numpy的數(shù)組運算廣播機制類似。如果一個索引值在DataFrame的列和Series的索引里都找不到,則對象將會從它們的聯(lián)合里重建索引。示例程序如下:2024/5/1150In[36]:frame=pd.DataFrame(np.arange(12.).reshape((4,3)),...: columns=list(bde), ...: index=[昆明,蘭州,長沙,桂林]) ...:series=frame.iloc[0] ...:print(frame) ...:print(series)bde昆明0.01.02.0蘭州3.04.05.0長沙6.07.08.0桂林9.010.011.0b0.0d1.0e2.0Name:昆明,dtype:float64In[37]:frame-seriesOut[37]:bde昆明0.00.00.0蘭州3.03.03.0長沙6.06.06.0桂林9.09.09.0pandas索引對象1.索引簡介pandas的索引對象用來保存坐標軸標簽和其他元數(shù)據(jù)(如坐標軸名稱)。構建Series或DataFrame時,任何數(shù)組或其他序列的標簽都在內部轉化為索引。pandas中的主要索引對象包括:●Index:最通用的索引對象,使用Python對象的numpy數(shù)組來表示坐標軸標簽?!馡nt64Index:對整型值的特化索引?!馦ultiIndex:“分層”索引對象,表示單個軸的多層次索引,可以認為是類似元組的數(shù)組。●DatetimeIndex:存儲納秒時間戳。使用numpy的Datetime64數(shù)據(jù)類型表示?!馪eriodIndex:對周期(時間間隔的)數(shù)據(jù)的特化索引?!馬angeIndex:區(qū)間索引,屬于Index的子類,作用是為數(shù)據(jù)選擇器提供一個數(shù)字索引,主要用于行索引。下面的代碼是RangeIndex索引對象的示例:2024/5/1151In[38]:obj=pd.Series([4,7,-5,3])...:objOut[38]:04172-533dtype:int64In[39]:print(obj.values)...:print(obj.index)#返回RangeIndex對象,類似range(4)[47-53

溫馨提示

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

評論

0/150

提交評論