Python大數據分析 教案 教學設計 第2章-數值計算_第1頁
Python大數據分析 教案 教學設計 第2章-數值計算_第2頁
Python大數據分析 教案 教學設計 第2章-數值計算_第3頁
Python大數據分析 教案 教學設計 第2章-數值計算_第4頁
Python大數據分析 教案 教學設計 第2章-數值計算_第5頁
已閱讀5頁,還剩23頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

授課時間第2、3、4次課,第周星期第節課時6授課方式理論課√討論課□習題課□實驗課□上機課□技能課□其他□授課題目第二章數值計算目的與要求1.了解NumPy數組的概念,掌握NumPy數組的創建方法、屬性和數據類型。2.熟悉數組的操作,掌握常用數組操作方法的使用。3.熟悉數組索引和切片的概念,掌握數組切片和索引方法。4.熟悉數組運算,掌握數組各類運算方法的使用。5.掌握NumPy的線性代數運算函數。6.熟悉數組的存取操作方法。7.熟悉數組的視圖與副本重點與難點重點:NumPy數組創建、數組索引和切片、數組運算。難點:NumPy線性代數函數。教學基本內容方法及手段NumPy是用于科學計算的一個開源的Python程序庫,它為Python提供了高性能數組與矩陣運算處理能力,為數據分析提供了數據處理的基礎功能。2.1NumPy多維數組NumPy提供了一個名為ndarray的多維數組對象,該數組元素具有固定大小,即NumPy數組元素是同質的,只能存放同一種數據類型的對象,因此能夠確定存儲數組所需空間的大小,能夠運用向量化運算來處理整個數組,具有較高的運算效率。2.1.1數組創建可以通過多種方式創建NumPy數組。1.通過array函數創建ndarray數組NumPy的array函數可以創建ndarray數組,對于多維數組的創建,使用嵌套序列數據即可完成。函數array可以將Python的列表、元組、數組或其他序列類型作為參數創建ndarray數組。[示例2-1]一維列表作為array參數In[]:importnumpyasnpa1=np.array([1,2,3,4,5,6])print(a1)Out[]:[123456][示例2-2]二維列表作為array參數In[]:importnumpyasnpa2=np.array([[1,2,3],[4,5,6]])print(a2)Out[]:[[123][456]][示例2-3]字符串作為array參數In[]:importnumpyasnpa3=np.array('abcdefg')a3Out[]:array('abcdefg',dtype='<U7')[示例2-4]元組作為array參數In[]:importnumpyasnpa4=np.array((1,2,3))a4Out[]:array([1,2,3])[示例2-5]字典作為array參數In[]:importnumpyasnpa5=np.array({'zhang':12,'dd':45})a5Out[]:array({'zhang':12,'dd':45},dtype=object)2.創建特殊數組NumPy提供了創建特殊數組的函數,如表2-1所示。表2-1特殊數組創建函數函數使用說明ones創建指定長度或形狀的全1數組ones_like以另一個數組為參考,根據其形狀和dtype創建全1數組zeros、zeros_like類似于ones、ones_like,創建全0數組empty、empty_like同上,創建沒有具體值的數eye、identity創建正方形的N×N單位矩陣[示例2-6]創建特殊數組In[]:importnumpyasnpb1=np.empty((2,3))print('b1=')print(b1)b2=np.zeros((3,5))print('b2=')print(b2)b3=np.ones((4,2))print('b3=')print(b3)b4=np.eye(3)print('b4=')print(b4)b5=np.ones_like(b1)print('b5=')print(b5)3.從數值范圍創建數組從數值范圍創建數組的NumPy函數有三個:arange、linspace和logspace函數。(1)arange函數函數arange根據start與stop指定的范圍以及step設定的步長,生成一個ndarray對象,函數格式如下所示。numpy.arange(start,stop,step,dtype)其中參數如表2-2所示。表2-2arange函數參數參數描述start起始值,默認為0stop終止值(不包含)step步長,默認為1dtype返回ndarray的數據類型,如果沒有提供,則會使用輸入數據的類型(2)linspacelinspace函數用于創建一個一維數組,數組是一個等差數列構成的,其格式如下。np.linspace(start,stop,num=50,endpoint=True,retstep=False,dtype=None)其中函數參數如2-3表所示。表2-3linspace函數參數參數描述start序列的起始值stop序列的終止值,如果endpoint為true,該值包含于數列中num要生成的等步長的樣本數量,默認為50endpoint該值為

ture

時,數列中包含stop值,反之不包含,默認是True。retstep如果為True時,生成的數組中會顯示間距,反之不顯示。dtypendarray

的數據類型(3)logspace函數logspace函數用于創建一個對數運算的等比數列,其格式如下所示。np.logspace(start,stop,num=50,endpoint=True,base=10.0,dtype=None)函數參數如表2-4所示。表2-4logspace函數參數參數描述start序列的起始值stop序列的終止值為。如果endpoint為true,該值包含于數列中num要生成的等步長的樣本數量,默認為50endpoint該值為

ture

時,數列中中包含stop值,反之不包含,默認是Truebase對數log的底數dtypendarray

的數據類型[示例2-7]從數值范圍創建數組In[]:importnumpyasnpc1=np.arange(10)c2=np.linspace(1,10,10)c3=np.logspace(10,100,10)print('c1=',c1)print('c2=',c2)print('c3=',c3)4.使用asarray函數創建NumPy數組函數asarray把Python的列表、元組等轉換為NumPy數組,其格式如下。numpy.asarray(a,dtype=None,order=None)函數參數如表2-5所示。表2-5asarray函數參數參數描述a任意形式的輸入參數,可以是列表、列表的元組、元組、元組的元組、元組的列表、多維數組dtype數據類型,可選order可選,有"C"和"F"兩個選項,分別代

行優先和列優先[示例2-8]asarray函數In[]:importnumpyasnpd1=[1,3,5,7,9]d2=np.asarray(d1)print(d2)Out[]:[13579]當然我們也可以把NumPy數組通過tolist函數轉換成Python列表。5.隨機數數組通過NumPy的隨機數函數可以創建隨機數數組,在numpy.random模塊中,提供了多種隨機生成函數。如表2-6所示。表2-6隨機數函數函數使用說明rand產生均勻分布的樣本值randint給定范圍內取隨機整數randn產生正態分布的樣本值seed隨機數種子permutation對一個序列隨機排序,不改變原數組shuffle對一個序列隨機排序,改變原數組Uniform(low,high,size)產生具有均勻分布的數組,low表示起始值,high表示結束值,size表示形狀normal(loc,scale,size)產生具有正態分布的數組,loc表示均值,scale表示標準差poisson(lam,size)產生具有泊松分布的數組,lam表示隨機事件發生率(1)rand函數函數rand產生一個給定形狀的數組,數組中的值服從[0,1)之間的均勻分布,其格式如下。numpy.random.rand(d0,d1,...,dn)參數d0,d1,...,dn為int型,可選。如果沒有參數則返回一個float型的隨機數,該隨機數服從[0,1)之間的均勻分布。其返回值是一個ndarray對象或者一個float型的值。[示例2-9]rand函數In[]:importnumpyasnpa=np.random.rand(2,4)print(a)Out[]:[[0.188212090.768048560.316783370.67669764][0.997522760.746654830.454623160.26944658]](2)uniform函數函數uniform返回一個在區間[low,high)中均勻分布的數組,其格式如下。uniform(low=0.0,high=1.0,size=None)參數low,high是float型或者float型的類數組對象。指定抽樣區間為[low,high),low的默認值為0.0,hign的默認值為1.0;size是int型或int型元組。指定形狀,如果不提供size,則返回一個服從該分布的隨機數。[示例2-10]uniform函數In[]:importnumpyasnpa=np.random.uniform(size=(2,4))b=np.random.uniform(3,5,(2,4))print(a)print(b)(3)randn函數函數randn返回一個指定形狀的數組,數組中的值服從標準正態分布(均值為0,方差為1),其格式如下。numpy.random.randn(d0,d1,...,dn)參數:d0,d,...,dn:int,可選。如果沒有參數,則返回一個服從標準正態分布的float型隨機數。返回值:ndarray對象或者float。[示例2-11]randn函數In[]:importnumpyasnpa=np.random.randn(2,4)print(a)(4)normal函數函數normal生成一個由size指定形狀的數組,數組中的值服從μ=loc,σ=scale的正態分布,其格式如下。numpy.random.normal(loc=0.0,scale=1.0,size=None)函數參數如下所述。loc:float型或者float型的類數組對象,指定均值

。scale:float型或者float型的類數組對象,指定標準差。size:int型或者int型的元組,指定了數組的形狀。如果不提供size,且loc和scale為標量(不是類數組對象),則返回一個服從該分布的隨機數。輸出:ndarray對象或者一個標量。[示例2-12]normal函數In[]:importnumpyasnpa=np.random.normal(size=(2,4))print(a)(5)randint函數函數randint生成一個在區間[low,high)中離散均勻抽樣的數組,其格式如下。numpy.random.randint(low,high=None,size=None,dtype='l')函數參數如下所示。low,high:int型,指定抽樣區間[low,high)size:int型或int型的元組,指定形狀dypte:可選參數,指定數據類型,比如int,int64等,默認是返回值:如果指定了size,則返回一個int型的ndarray對象,否則返回一個服從該分布的int型隨機數。[示例2-13]randint函數In[]:importnumpyasnpa=np.random.randint(1,10,size=(2,4))print(a)Out[]:[[5187][1542]](6)numpy.random.random(size=None)函數random生成[0,1)之間均勻抽樣的數組,其格式如下。numpy.random.random(size=None)參數size:int型或int型的元組,如果不提供則返回一個服從該分布的隨機數。返回值:float型或者float型的ndarray對象。[示例2-13]random函數In

[]:importnumpyasnpa=np.random.random((2,4))print(a)2.1.2數組對象屬性ndarray對象具有多個十分有用的屬性,如表2-7所示。表2-7ndarray對象屬性屬性使用說明ndim秩,即數據軸的個數shape數組的維度size元素的總個數dtype數據類型itemsize數組中每個元素的字節大小nbytes存儲整個數組所需的字節數量,是itemsize屬性值和size屬性值之積T數組的轉置flat返回一個numpy.flatiter對象,可以使用flat的迭代器來遍歷數組屬性T。如果數組的秩(rank)小于2,那么所得只是一個數組的視圖。屬性flat提供了一種遍歷方式,同時還可以給flat屬性賦值。不過賦值會覆蓋整個數組內所有元素的值。[示例2-14]random函數In

[]:importnumpyasnpa=np.array([np.arange(3),np.linspace(3,5,3)])print(np.arange(5).T)#一維數組的轉置為自身視圖print('a=')print(a)print(a.ndim,a.shape,a.size,a.dtype,a.itemsize,a.nbytes)print('數組轉置')print(a.T)foritemina.flat:print(item,end=",")2.1.3數組數據類型Python雖然支持整型、浮點型和復數型,但對于科學計算來說,仍然需要更多的數據類型來滿足在精度和存儲大小方面的各種不同要求。NumPy提供了豐富的數據類型,如表2-8所示。表2-8數據類型類型說明bool布爾型(值為True或False),占用1bitinti其長度取決于平臺的整數(通常為int32或者int64)int8字節類型(取值范圍從-128~127)int16整型(取值范圍32768~32767)int32整型(取值范圍為-231~231-1)int64整型(取值范圍為-263~263-1)uint8無符號整型(取值范圍為0~255)uint16無符號整型(取值范圍為0~65535)uint32無符號整型(取值范圍為0~232-1)uint64無符號整型()(取值范圍為0~2641)float16半精度浮點型:符號占用1bit,指數占用5bit,尾數占用10bitfloat32單精度浮點型:符號占用1bit,指數占用8bit,尾數占用23bitfloat64位或者float雙精度浮點型:符號占用1bit,指數占用11bit,尾數占用52bitcomplex64復數類型,由兩個32位浮點數(實部和虛部)表示complex128或者complex復數類型,由兩個64位浮點數(實部和虛部)表示備注:數據類型的名稱以數字結尾,表示該類型的變量所占用的二進制位數。1.dtype指定數據類型創建數組時,如果沒有指定數據類型,NumPy會給新建的數組一個合適的數據類型。當然也可以給創建的數組明確指定數據類型,指定數據類型是通過參數dtype實現的。2.astype轉換數據類型astype()函數可以把數組元素轉換成指定類型。注意:(1)指定類型有兩種寫法。以float64為例:np.float64和“float64”,這兩種方式效果相同。(2)將浮點數轉換為整數時元素的小數部分被截斷,而不是四舍五入。(3)數值型的字符串可以通過astype方法將其轉換為數值類型,但如果字符串中有非數值型字符進行轉換就會報錯。(4)astype方法會創建一個新的數組,并不會改變原有數組的數據類型。[示例2-16]astype函數In

[]:importnumpyasnpa=np.array([[1.1,2.2],[3.3,3.4]],dtype=np.float)b=a.astype()print('a=',a)print('b=',b)c=np.arange(5,dtype=8)print('c.dtype=',c.dtype)print('數據類型轉換后的dtype=',c.astype(np.float).dtype)print('c的數據類型沒有改變,c.dtype=',c.dtype)2.2數組操作NumPy中包含了一些函數用于操作數組,大致分為六類:修改數組形狀、翻轉數組、修改數組維度、連接數組、分割數組、數組元素的添加與刪除。2.2.1修改數組形狀修改數組形狀的函數如表2-9所示。表2-9修改數組形狀函數函數描述reshap

不改變數據的條件下修改形狀flatten返回一份數組拷貝,對拷貝所做的修改不會影響原始數組ravel返回展開數組1.reshape函數函數reshape在不改變數據的條件下修改形狀,其格式如下。numpy.reshape(arr,newshape,order='C')其函數參數如表2-10所示。表2-10reshape函數參數參數描述arr要修改形狀的數組newshape新形狀參數,為整數或者整數數組,新的形狀應當兼容原有形狀order'C'按行,'F'按列,

A'原順序,'k'元素在內存中的出現順序。2.flatten函數函數flatten返回一份數組拷貝,對拷貝所做的修改不會影響原始數組,其格式如下所示。ndarray.flatten(order='C')函數參數order與reshape函數的參數order相同。3.ravel函數函數ravel展平數組元素,順序通常是“C風格”,返回的是數組視圖,其函數格式如下所示。numpy.ravel(a,order='C')函數參數order與reshape函數的參數order相同。函數flatten與ravel的區別在于返回拷貝還是返回視圖,numpy.flatten()返回一份拷貝,對拷貝所做的修改不會影響原始數組,而numpy.ravel返回的是視圖,對視圖修改會影響原始數組。[示例2-17]修改數組形狀In

[]:importnumpyasnpa=np.arange(12).reshape(2,6)b=a.reshape(3,4)print('reshape輸出')print(a)print(b)print('flatten輸出')c=a.flatten('F')c[0]=100print(c)print(a)#數組a[0,0]的值沒有被修改print('ravel輸出')d=a.ravel()d[0]=100print(d)print(a)#通過修改d[0]的值,修改了a[0,0]的值2.2.2翻轉數組數組翻轉函數如表2-11所示。表2-11翻轉數組函數函數描述transpose對換數組的維度swapaxes對換數組的兩個軸1.numpy.transpose函數用于對換數組的維度,格式如下所示。numpy.transpose(arr,axes)參數說明如下所示。arr:要操作的數組。axes:整數列表,對應維度,通常所有維度都會對換。numpy.ndarray.T類似numpy.transpose。2.numpy.swapaxesnumpy.swapaxes函數用于交換數組的兩個軸,格式如下所示。numpy.swapaxes(arr,axis1,axis2)參數arr:輸入的數組。axis1:交換軸中的第一個軸的整數axis2:交換軸中的第二個軸的整數[示例2-18]翻轉數組In

[]:importnumpyasnpa=np.arange(6).reshape(2,3)b=a.transpose()c=np.transpose(a)print('transpose輸出')print('a=',a)print('b=',b)print('c=',c)d=np.swapaxes(a,0,1)#第1軸與第2軸數據交換print('swapaxes輸出')print('d=',d)2.2.3連接數組數組連接函數如表2-12所示。表2-12數組連接函數函數描述concatenate連接沿現有軸的數組序列stack沿著新的軸加入一系列數組。hstack水平堆疊序列中的數組(列方向)vstack豎直堆疊序列中的數組(行方向)1.numpy.concatenatenumpy.concatenate函數用于沿指定軸連接相同形狀的兩個或多個數組,格式如下所示。numpy.concatenate((a1,a2,...),axis)參數a1,a2,...:相同類型的數組。axis:沿著它連接數組的軸,默認為0。2.numpy.stacknumpy.stack函數用于沿新軸連接數組序列,格式如下所示。numpy.stack(arrays,axis)參數arrays相同形狀的數組序列。axis:返回數組中的軸,輸入數組沿著它來堆疊。3.numpy.hstacknumpy.hstack是numpy.stack函數的變體,它通過水平堆疊來生成數組。4.numpy.vstacknumpy.vstack是numpy.stack函數的變體,它通過垂直堆疊來生成數組。[示例2-19]連接數組In

[]:importnumpyasnp?a=np.array([[1,2],[3,4]])b=np.array([[11,12],[13,14]])c=np.concatenate((a,b))d=np.concatenate((a,b),1)e=np.stack(c,0)f=np.stack(c,1)g=np.hstack((a,b))h=np.vstack((a,b))print('a=',a)print('b=',b)print('c=',c)print('d=',d)print('e=',e)print('f=',f)print('g=',g)print('h=',h)2.2.4分割數組分割數組函數如表2-13所示。表2-13數組分割函數函數描述split將一個數組分割為多個子數組hsplit將一個數組水平分割為多個子數組(按列)vsplit將一個數組垂直分割為多個子數組(按行)1.numpy.splitnumpy.split函數沿特定的軸將數組分割為子數組,格式如下所示。numpy.split(ary,indices_or_sections,axis)參數ary:被分割的數組。indices_or_sections:如果是一個整數,就用該數平均切分,如果是一個數組,為沿軸切分的位置(左開右閉)。axis:沿著哪個維度進行切向,默認為0,橫向切分。為1時,縱向切分。2.numpy.hsplitnumpy.hsplit函數用于水平分割數組,通過指定要返回的相同形狀的數組數量來拆分原數組。3.numpy.vsplitnumpy.vsplit沿著垂直軸分割,其分割方式與hsplit用法相同。[示例2-20]數組分割In

[]:importnumpyasnpa=np.arange(24).reshape(4,6)b=np.split(a,2)c=np.split(a,[2,3])d=np.hsplit(a,3)e=np.vsplit(a,2)print('a=',a)print('b=',b)print('c=',c)print('d=',d)print('e=',e)2.2.5數組元素添加與刪除數組元素添加和刪除的元素如表2-14所示。表2-14數組添加和刪除函數函數元素及描述resize返回指定形狀的新數組append將值添加到數組末尾insert沿指定軸將值插入到指定下標之前delete刪掉某個軸的子數組,并返回刪除后的新數組1.numpy.resizenumpy.resize函數返回指定大小的新數組。如果新數組大小大于原始大小,則包含原始數組中元素的副本。函數resize格式如下所示。numpy.resize(arr,shape)參數arr:要修改大小的數組。shape:返回數組的新形狀。2.numpy.appendnumpy.append函數在數組的末尾添加值。追加操作會分配整個數組,并把原來的數組復制到新數組中。此外,輸入數組的維度必須匹配否則將生成ValueError。append函數返回的始終是一個一維數組,其格式如下所示。numpy.append(arr,values,axis=None)參數arr:輸入數組。values:要向arr添加的值,需要和arr形狀相同(除了要添加的軸)。axis:默認為None。當axis無定義時,是橫向加成,返回總是為一維數組。當axis有定義的時候,分別為0和1。當axis為0時,數據是夾在下邊(列數要相同);當axis為1時,數組是加在右邊(行數要相同)。3.numpy.insertnumpy.insert函數在給定索引之前,沿給定軸在輸入數組中插入值。numpy.insert(arr,obj,values,axis)參數說arr:輸入數組。obj:在其之前插入值的索引。values:要插入的值。axis:沿著它插入的軸,如果未提供,則輸入數組會被展開。5.numpy.deletenumpy.delete函數返回從輸入數組中刪除指定子數組的新數組。與insert()函數的情況一樣,如果未提供軸參數,則輸入數組將展開。numpy.delete(arr,obj,axis)參數arr:輸入數組。obj:可以被切片,整數或者整數數組,表明要從輸入數組刪除的子數組。axis:沿著它刪除給定子數組的軸,如果未提供,則輸入數組會被展開。[示例2-21]數組元素的添加與刪除In

[]:importnumpyasnp#resize函數a=np.arange(4).reshape(2,2)print('a=',a)a.resize((1,4))print('一行四列a=',a)a.resize((4,1))print('四行一列a=',a)#append函數b=np.arange(6).reshape(3,2)print('數組b=',b)c=np.append(b,[6,7])print('append的c=',c)d=np.append(b,[[11,12]],axis=0)print('append后的d=',d)e=np.append(b,[[100,200],[300,400],[500,600]],axis=1)print('append后的e=',e)#insert函數f=np.insert(b,2,11)h=np.insert(b,2,10,axis=0)i=np.insert(b,1,10,axis=1)print('f=',f)print('h=',h)print('i=',i)#delete函數j=np.delete(i,[1,2],axis=1)k=np.delete(h,2,axis=0)l=np.delete(f,2)print('j=',j)print('k=',k)print('l=',l)2.3數組索引與切片ndarray對象的內容可以通過索引或切片來訪問和修改,與Python中列表的切片操作一樣。2.3.1數組索引一維NumPy數組的索引與Python列表的索引相同;二維數組的索引在單個或多個軸向上完成,在某一軸上與一維數組索引相同。[示例2-22]一維數組索引In

[]:#一維數組索引importnumpyasnpa=np.linspace(-10,10,11)print(a)print('a[1]=',a[1],',a[5]=',a[5],',a[10]=',a[10],',a[-1]=',a[-1])a[0],a[1],a[2]=100,200,300print(a)Out[]:[-10.-8.-6.-4.-2.0.2.4.6.8.10.]a[1]=-8.0,a[5]=0.0,a[10]=10.0,a[-1]=10.0[100.200.300.-4.-2.0.2.4.6.8.10.][示例2-23]二維數組索引In

[]:importnumpyasnpa=np.arange(12).reshape(3,4)print('a=',a)print('a[0]=',a[0],',a[2]=',a[2])print('a[0,0]=',a[0,0],',a[0][0]=',a[0][0],',a[1,2]=',a[1,2],',a[1][2]=',a[1][2])a[0]=10print('a[0]值已修改',a)a[1]=[100,100,100,100]print('a[1]值已修改',a)a[2,0]=1000print('a[2,0]值已修改',a)2.3.2數組切片一維數組切片格式是[starting_index,ending_index,step],starting_index表示切片的開始索引,可以省略,省略時為0,ending_index表示切片的結束索引,省略時表示數組的最后一個索引,step表示步長,即從開始索引到結束索引多長取一個值,默認為1。多維數組的切片是按照軸方向進行的,在每一個軸上與一維數組相同。當切片只有一維時,數組就會按照0軸方向進行切片。[示例2-24]一維數組切片In

[]:importnumpyasnpa=np.arange(12)print('a=',a)print('a[1:3]=',a[1:3],',a[9:]=',a[9:])print('a[1:7:2]=',a[1:7:2])print('a[:]=',a[:])Out[]:a=[01234567891011]a[1:3]=[12],a[9:]=[91011]a[1:7:2]=[135]a[:]=[01234567891011][示例2-25]二維數組切片In

[]:importnumpyasnpa=np.arange(12).reshape(3,4)print('a=',a)print('a[0:2][1:3]=',a[0:2][1:3],',a[2:][:2]=',a[2:][1:2])print('a[0:2]=',a[0:2])print('a[:]=',a[:])2.3.3布爾型索引布爾型索引是指使用布爾數組來索引目標數組,以此找出與布爾數組中值為True的對應的目標數組中的數據。注意:布爾數組的長度必須與目標數組對應的軸的長度一致。[示例2-26]布爾索引In

[]:importnumpyasnpfromnumpy.randomimportrandn#用來生成一些正態分布的隨機數據names=np.array(['張','王','李','趙','上官','公孫'])#儲存姓名的數組data=randn(6,3)#生成含隨機值的數組print(data)print('上官對應的行:',data[names=='上官'])In

[55]:importnumpyasnpa=np.arange(12).reshape(3,4)print(a)print('a>5',a>5)print('a[a>5]',a[a>5])Out[]:[[0123][4567][891011]]a>5[[FalseFalseFalseFalse][FalseFalseTrueTrue][TrueTrueTrueTrue]]a[a>5][67891011]2.3.4花式索引花式索引是可以通過整數列表或數組進行索引,也可以使用np.ix_函數完成同樣的操作。[示例2-27]花式索引In

[]:importnumpyasnpa=np.arange(16).reshape(4,4)print('花式索引1:',a[[0,2,3]][[0,2]])print('花式索引2:',a[[0,2,3]][:,[0,2]])print('ix=',np.ix_([0,2,3],[0,2]))print('花式索引3:',a[np.ix_([0,2,3],[0,2])])2.4數組的運算數組的運算支持向量化運算,并且比Python具有更快的運算速度。2.4.1數組和標量間的運算數組與標量的算術運算,以及相同維度的數組的算術運算都是直接應用到元素中,也就是元素級運算。[示例2-28]數組和標量運算In

[]:importnumpyasnpa=np.arange(6)b=a*10c=a.reshape(2,3)d=c*100print('a=',a)print('b=',b)print('c=',c)print('d=',d)Out[]:a=[012345]b=[01020304050]c=[[012][345]]d=[[0100200][300400500]]e=[01491625]2.4.2廣播廣播是指NumPy在算術運算期間處理不同形狀的數組的能力。對數組的算術運算通常在相應的元素上進行。如果兩個陣列具有完全相同的形狀,則這些操作可被無縫執行。如果兩個數組的維數不相同,則元素到元素的操作是不可能的。然而,在NumPy中仍然可以對形狀不相似的數組進行操作,因為它擁有廣播功能。較小的數組會被廣播到較大數組的大小,以便使它們的形狀可兼容。如果上述規則產生有效結果,并且滿足以下條件之一,那么數組被稱為可廣播的。1.數組擁有相同形狀。2.數組擁有相同的維數,每個維度擁有相同長度,或者長度為1。3.數組擁有極少的維度,可以在其前面追加長度為1的維度,使上述條件成立。[示例2-29]廣播In

[]:importnumpyasnpa=np.array([1,2])b=np.array([11,12])c=np.array([[11,12],[13,14]])print('a+b=',a+b)print('a+c',a+c)Out[]:a+b=[1214]a+c[[1214][1416]]2.4.3算數函數算術運算的一目函數如表2-15所示。表2-15一目數學函數函數描述用法absfabs計算整型/浮點/復數的絕對值對于沒有復數的快速版本求絕對值np.abs()np.fabs()sqrt計算元素的平方根。等價于array**0.5np.sqrt()square計算元素的平方。等價于array**2np.squart()exp計算以自然常數e為底的冪次方np.exp()Loglog10log2log1p自然對數(e)基于10的對數基于2的對數基于log(1+x)的對數np.log()np.log10()np.log2()np.log1p()sign計算元素的符號:1:正數0:0-1:負數np.sign()ceil計算大于或等于元素的最小整數np.ceil()floor計算小于或等于元素的最大整數np.floor()around四舍五入到給定的小數位np.around()rint對浮點數取整到最近的整數,但不改變浮點數類型np.rint()modf分別返回浮點數的整數和小數部分的數組np.modf()isnan返回布爾數組標識哪些元素是NaN(不是一個數)np.isnan()isfiniteisinf判斷元素是有限的數判斷元素是否無限大np.isfiniter()np.isinf()cos,cosh,sinsinh,tan,tanh三角函數arccos,arccosh,arcsin,arcsinh,arctan,arctanh反三角函數logical_and/or/not/xor邏輯與/或/非/異或等價于‘&’‘|’‘!’‘^’Numpy數學運算的二目函數入保2-16所示。表2-16二目數學函數函數描述用法add數組對應元素相加np.add(A,B)substract數組對應元素相減np.substract(A,B)dotmultiply*dot是是叉積,數組和矩陣對應位置相乘multiply是點積,矩陣對應位置相乘,要求矩陣維度相同*是點積,對數組執行對應位置相乘,必要時使用廣播規則divide=/true_dividefloor_divide=//數組對應元素相除地板除mod,remainder,fmod模運算power使用第二個數組作為指數,計算第一個數組中的元素np.power(A,B)maximum兩數組對應元素比大小取其大者,返回一個數組np.maximum:(X,Y,out=None)minimun兩數組對應元素比大小取其小者copysign將第二個數組中各元素的符號賦值給第一個數組的對應元素greater,greater_equal,less,less_equal,equal,not_equal基于元素的比較,產生布爾數組。等價于>,>=,<,<=,==,!=[示例2-30]三角函數與反三角函數In

[]:importnumpyasnpa=np.array([0,30,45,60,90])b=a*np.pi/180#通過乘pi/180轉化為弧度print('正弦值:',np.sin(b))print('余弦值:',np.cos(b))print('正切值:',np.tan(b))c=np.arcsin(np.sin(b))#求正弦后再求反正弦print(c*180/np.pi)#弧度轉化為角度Out[]:正弦值:[0.0.50.707106780.86602541.]余弦值:[1.00000000e+008.66025404e-017.07106781e-015.00000000e-016.12323400e-17]正切值:[0.00000000e+005.77350269e-011.00000000e+001.73205081e+001.63312394e+16][0.30.45.60.90.][示例2-31]around函數In

[]:importnumpyasnpa=np.array([1.2,15.55,123.45,0.537,125.32])print('原數組:',a)print('舍入后:')print(np.around(a))print(np.around(a,decimals=1))print(np.around(a,decimals=-1))Out[]:原數組:[1.215.55123.450.537125.32]舍入后:[1.16.123.1.125.][1.215.6123.40.5125.3][0.20.120.0.130.][示例2-32]power函數In

[]:importnumpyasnpa=np.array([1,2,3,4,5])b=np.array([5,4,3,2,1])c=np.power(a,b)d=np.sqrt(a)print(c)print(d)Out[]:[11627165][1.1.414213561.732050812.2.23606798][示例2-33]floor函數與ceil函數In

[]:importnumpyasnpa=np.array([-2.8,0.75,-1.2,5.6,100])print('提供的數組:',a)print('floor后的數組:',np.floor(a))print('ceil后的數組',np.ceil(a))Out[]:提供的數組:[-2.80.75-1.25.6100.]floor后的數組:[-3.0.-2.5.100.]ceil后的數組[-2.1.-1.6.100.][示例2-34]dd、subtract、multiply和divide函數In

[]:importnumpyasnpa=np.array([[0,1,2],[3,4,5],[6,7,8]])b=np.array([11,12,13])print(np.add(a,b))print(np.subtract(a,b))print(np.multiply(a,b))print(np.divide(a,b))Out[]:[[111315][141618][171921]][[-11-11-11][-8-8-8][-5-5-5]][[01226][334865][6684104]][[0.0.083333330.15384615][0.272727270.333333330.38461538][0.545454550.583333330.61538462]][示例2-35]次方與平方根In

[33]:importnumpyasnpa=np.array([1,4,9,16])b=np.power(a,2)c=np.sqrt(a)print('數組:',a)print('平方:',b)print('算術平方根:',b)數組:[14916]平方:[11681256]算術平方根:[11681256][示例2-36]mod函數In

[]:importnumpyasnpa=np.arange(11,20)b=np.arange(1,10)print('a=',a)print('b=',b)print('mod(a,b)=',np.mod(a,b))Out[]:a=[111213141516171819]b=[123456789]mod(a,b)=[001204321]2.4.4集合運算NumPy庫提供了針對一維數組的基本集合運算,如表2-17所示。表2-17集合運算函數使用說明unique(x)唯一值intersectld(x,y)公共元素unionld(x,y)并集inld(x,y)x的元素是否在y中,返回布爾型數組setdiffla(x,y)集合的差setxorld(x,y)交集取反1.unique唯一值在數據分析中,常使用np.unique方法來找出數組中的唯一值,即去除數組中的重復元素,格式如下。numpy.unique(arr,return_index,return_inverse,return_counts)參數arr:輸入數組,如果不是一維數組則會展開。return_index:如果為true,返回新列表元素在舊列表中的位置(下標),并以列表形式儲。return_inverse:如果為true,返回舊列表元素在新列表中的位置(下標),并以列表形式儲。return_counts:如果為true,返回去重數組中的元素在原數組中的出現次數。2.inld是否包含np.inld方法方法用于測試第一個數組中的元素是否包含在第二個數組中,第一個數組的每個元素返回一個布爾值(元素在第二個數組返回True,否則返回False),函數返回一個布爾型數組。[示例2-37]unique函數In

[]:#uniqe函數importnumpyasnpa=np.array([1,2,6,1,7,6,2,8,2,9,3,2])print('a=',a)print('去重值:',np.unique(a))u,indices=np.unique(a,return_index=True)print('去重數組的索引數組:',indices)u,indices=np.unique(a,return_inverse=True)print('下標為:',indices)print('使用下標重構原數組:',u[indices])print('返回去重元素的重復數量:')u,indices=np.unique(a,return_counts=True)print(u)print(indices)Out[]:a=[126176282932]去重值:[1236789]去重數組的索引數組:[01102479]下標為:[013043151621]使用下標重構原數組:[126176282932]返回去重元素的重復數量:[1236789][2412111][示例2-38]inld函數In

[]:importnumpyasnpx=np.array([1,3,4,6])y=np.array([1,2,3,4])z=np.array([3,4,5,6])print(np.in1d(x,y))print(np.in1d(x,z))Out[]:[TrueTrueTrueFalse][FalseTrueTrueTrue]2.4.5統計運算NumPy庫支持對整個數組或按指定軸向的數據進行統計計算。例如,sum函數用于求和;mean函數用于求算術平均數;std函數用于求標準差。基本數組的統計方法如表2-18所示表2-18基本數組統計方法方法使用說明sum求和mean算數平均數std、var標準差和方差min、max最小值和最大值argmin、argmax最小和最大元素的索引cumsum所有元素的累計和cumprod所有元素的累計積統計函數具有axis參數,用于計算指定軸方向的統計值,axis默認值為None,此時把數組當成一維數組。cumsum和cumpod方法按照所給定的軸參數返回元素的梯形累計。[示例2-39]統計函數In

[]:importnumpyasnpa=np.arange(9).reshape(3,3)print(a)print('sum=',np.sum(a))print('mean=',np.mean(a))print('std=',np.std(a))print('var=',np.var(a))print('argmin=',np.argmin(a))print('argmax=',np.argmax(a))print('cumsum=',np.cumsum(a))print('cumprod=',np.cumprod(a))print('第0軸sum=',np.sum(a,0))print('第1軸mean=',np.mean(a,1))print('第0軸std=',np.std(a,0))print('第1軸var=',np.var(a,1))print('第0軸argmin=',np.argmin(a,0))print('第1軸argmax=',np.argmax(a,1))print('第0軸cumsum=',np.cumsum(a,1))print('第1軸cumprod=',np.cumprod(a,0))2.4.6排序NumPy中提供了各種排序相關功能。這些排序函數實現不同的排序算法,排序算法的不同在于執行速度,最壞情況性能,所需的工作空間和算法的穩定性。1.numpy.sort()函數sort()返回輸入數組的排序副本,格式如下。numpy.sort(a,axis,kind,order)其中參數如下所示。a要排序的數組。axis沿著它排序數組的軸,如果沒有數組會被展開,沿著最后的軸排序。kind默認為'quicksort'(快速排序)。(4)order如果數組包含字段,則是要排序的字段。其中kind取值如表2-19所示。表2-19排序算法種類排序算法最壞情況'quicksort'快速排序O(n^2)'mergesort'歸并排序O(n*log(n))'heapsort'堆排序O(n*log(n))2.argsort排序numpy.argsort()函數對輸入數組沿給定軸執行間接排序,并使用指定排序類型返回數據的索引數組。這個索引數組用于構造排序后的數組。[示例2-40]sort排序In

[]:importnumpyasnpa=np.array([[2,5,6],[8,6,4],[6,4,9]])print('a=',a)print('a排序(默認最后1軸):',np.sort(a))#沿著最后的軸(第1軸)排序print('a按照第0軸排序:',np.sort(a,0))#沿著第0軸)排序dt=np.dtype([('sno','S10'),('score','int8')])b=np.array([('1908',56),('1902',98),('1903',72),('1909',88),('1906',65)],dtype=dt)print('b=',b)print(np.sort(b,order='sno'))c=np.argsort(a)print('argsort排序索引:',c)print(a[c])[示例2-41]argsort排序In

[]:importnumpyasnpx=np.array([3,1,2])y=np.argsort(x)print('y=',y)print('x=',x)print('x[y]=',x[y])Out[]:y=[120]x=[312]x[y]=[123]2.4.7搜索1.numpy.where()where()有兩種形式。(1)np.where(condition)參數只有條件condition,輸出滿足條件元素的坐標(索引)。這里的坐標以tuple的形式給出,通常原數組有多少維,輸出的tuple中就包含幾個數組,分別對應符合條件元素的各維坐標。(2)np.where(condition,x,y)滿足條件condition輸出x,不滿足輸出y。2.numpy.extract()extract()函數返回滿足任何條件的元素。3.numpy.nonzero()numpy.nonzero()函數返回輸入數組中非零元素的索引。[示例2-42]搜索In

[35]:importnumpyasnpx=np.arange(9.).reshape(3,3)print('我們的數組是:',x)print('大于3的元素的索引:',np.where(x>3))print('大于3的元素:',x[np.where(x>3)])print(np.where(x>3,'大','小'))print('extract函數,整除2的數:',np.extract(np.mod(x,2)==0,x))print('nonzero:',np.nonzero(x))print('x中非零數:',x[np.nonzero(x)])2.5線性代數數組的運算大多是元素級的,數組相乘的結果是各對應元素的積組成的數組,但是矩陣相乘使用的是點積,NumPy庫提供用于矩陣乘法的dot函數。另外NumPy庫的linalg模塊來完成具有線性代數運算方法。NumPy提供的線性代數函數如表2-20所示。表2-20線性代數函數函數描述dot兩個數組的點積,即元素對應相乘。vdot兩個向量的點積det數組的行列式solve求解線性矩陣方程inv計算矩陣的乘法逆矩陣2.5.1數組相乘1.函數dot()函數dot對于兩個一維的數組,計算的是這兩個數組對應下標元素的乘積和(內積);對于二維數組,計算的是兩個數組的矩陣乘積。numpy.dot(a,b,out=None)參數說明:a

:ndarray數組b

:ndarray數組out

:ndarray,可選,用來保存dot()的計算結果2.函數vdot()函數vdot是兩個向量的點積。如果第一個參數是復數,那么它的共軛復數會用于計算。如果參數是多維數組,它會被展開。[示例2-43]數組乘積In

[]:importnumpyasnpa=np.array([[1,2],[3,4]])b=np.array([[5,6],[7,8]])c=np.dot(a,b)d=np.vdot(a,b)print('dot=',c)#矩陣乘積print('vdot=',d)#=1*3+2*4+5*7+6*8=70Out[]:dot=[[1922][4350]]vdot=702.5.2矩陣行列式numpy.linalg.det()函數計算輸入矩陣的行列式。[示例2-44]求矩陣行列式In

[]:importnumpyasnpa=np.array([[1,2],[3,4]])b=np.linalg.det(a)print(b)Out[]:-2.00000000000000042.5.3逆矩陣numpy.linalg.inv()函數計算矩陣的乘法逆矩陣。注意:如果矩陣是奇異的或者非方陣,使用inv函數求逆矩陣,會出現錯誤。[示例2-45]逆矩陣In

[]:importnumpyasnpa=np.array([[1,2],[3,4]])b=np.linalg.inv(a)print(a)print(b)print(np.dot(a,b))#驗證Out[]:[[12][34]][[-2.1.][1.5-0.5]][[1.0000000e+000.0000000e+00][8.8817842e-161.0000000e+00]]2.5.4線性方程組numpy.linalg中的solve函數可以求解線性方程組線性方程組Ax=b,其中A是一個矩陣,b是一維或者二維數組,而x是未知量。[示例2-46]求解線性方程x+y+z=62y+5z=-42x+5y-z=27In

[]:importnumpyasnpA=np.mat("111;025;25-1");b=np.array([6,-4,27])x=np.linalg.solve(A,b)print('方程解:',x)print(c.ndim)print(np.dot(A,x))#驗證Out[]:方程解:[5.3.-2.]1[[6.-4.27.]]2.5.5特征值和特征向量計算特征值時,我們可以求助于numpy.linalg程序包提供的eigvals()函數eig()函數,其中函數eigvals返回矩陣的特征向量,eig函數返回一個元組,其元素為特征值和特征向量。[示例2-47]特征值和特征向量In

[]:importnumpyasnpA=np.mat("1-1;24")e=np.linalg.eigvals(A)print('eigvals特征值:',e)e,v=np.linalg.eig(A)print("

溫馨提示

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

評論

0/150

提交評論