第4章 NumPy數(shù)據(jù)分析_第1頁
第4章 NumPy數(shù)據(jù)分析_第2頁
第4章 NumPy數(shù)據(jù)分析_第3頁
第4章 NumPy數(shù)據(jù)分析_第4頁
第4章 NumPy數(shù)據(jù)分析_第5頁
已閱讀5頁,還剩42頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第4章NumPy數(shù)據(jù)分析第4章NumPy數(shù)據(jù)分析創(chuàng)建數(shù)組對象數(shù)組數(shù)據(jù)類型多維數(shù)組數(shù)組索引數(shù)組元素值的替換數(shù)據(jù)的廣播機制數(shù)組形狀的操作Axis理解4.1Numpy庫簡介Numpy是一個開源的Python科學計算庫,用于快速處理任意維度的數(shù)組。Numpy支持常見的數(shù)組和矩陣操作,對于同樣的數(shù)值計算任務,使用NumPy不僅代碼要簡潔的多,而且NumPy的性能遠遠優(yōu)于原生Python,基本是一個到兩個數(shù)量級的差距,而且數(shù)據(jù)量越大,NumPy的優(yōu)勢就越明顯。Numpy最為核心的數(shù)據(jù)類型是ndarray,使用ndarray可以處理一維、二維和多維數(shù)組,該對象相當于是一個快速而靈活的大數(shù)據(jù)容器。NumPy底層代碼使用C語言編寫,解決了GIL(GlobalInterpreterLock,全局解釋器鎖)的限制,ndarray在存取數(shù)據(jù)的時候,數(shù)據(jù)與數(shù)據(jù)的地址都是連續(xù)的,這確保了可以進行高效率的批量操作,遠遠優(yōu)于Python中的list。另一方面,ndarray對象提供了更多的方法來處理數(shù)據(jù),尤其是和統(tǒng)計相關的方法,這些方法也是Python原生的list沒有的。4.2Numpy庫安裝與使用4.2.1安裝在cmd命令行窗口輸入以下命令,等待安裝完成即可。4.2.2使用pipinstallnumpyimport

numpy

as

np4.3創(chuàng)建數(shù)組對象通常情況下,創(chuàng)建數(shù)組(ndarray)對象有四種方法。4.3.1通過np.array創(chuàng)建數(shù)組a=np.array([1,2,3,4])#傳入列表atype(a)輸出結(jié)果:array([1,2,3,4])numpy.ndarray4.3創(chuàng)建數(shù)組對象4.3.2通過np.arange創(chuàng)建數(shù)組b=np.arange(0,10,2)#創(chuàng)建0-10,步數(shù)為2的數(shù)組b輸出結(jié)果:array([0,2,4,6,8])4.3創(chuàng)建數(shù)組對象4.3.3通過np.random.random創(chuàng)建數(shù)組c=np.random.random((2,2))#

創(chuàng)建2行2列的數(shù)組c輸出結(jié)果:array([[0.22098921,0.12727261],[0.04631855,0.21257259]])4.3創(chuàng)建數(shù)組對象4.3.4通過特殊函數(shù)創(chuàng)建數(shù)組#zeros函數(shù)array_zeros=np.zeros((3,3))#3行3列全零數(shù)組array_zeros輸出結(jié)果:array([[0.,0.,0.],[0.,0.,0.],[0.,0.,0.]])4.3創(chuàng)建數(shù)組對象4.3.4通過特殊函數(shù)創(chuàng)建數(shù)組#ones函數(shù)array_ones=np.ones((4,4))#4行4列全一數(shù)組array_ones

#full函數(shù)array_full=np.full((2,3),9)#值為9的2行3列數(shù)組array_full

#eye函數(shù)array_eye=np.eye(4)#生成一個在斜方形上元素為1,其他元素都為0的4行4列矩陣array_eye4.4數(shù)組數(shù)據(jù)類型Numpy的數(shù)據(jù)類型主要包括布爾值、整數(shù)、浮點數(shù)、復數(shù)、字符串和python對象類型,如表5.1所示。4.4.1數(shù)據(jù)類型數(shù)據(jù)類型描述唯一標識符bool用一個字節(jié)存儲的布爾類型(True或False)bint8一個字節(jié)大小,-128至127i1int16整數(shù),16位整數(shù)(-32768~32767)i2int32整數(shù),32位整數(shù)(-2147483648~2147483647)i4int64整數(shù),64位整數(shù)(-9223372036854775808~9223372036854775807)i8uint8無符號整數(shù),0至255u1uint16無符號整數(shù),0至65535u2uint32無符號整數(shù),0至2**32-1u4uint64無符號整數(shù),0至2**64-1u8float16半精度浮點數(shù):16位,正負號1位,指數(shù)5位,精度10位f24.4數(shù)組數(shù)據(jù)類型4.4.2創(chuàng)建數(shù)組指定數(shù)據(jù)類型a=np.array([1,2,3,4,5],dtype='i1')#使用dtype指定創(chuàng)建數(shù)組的數(shù)據(jù)類型aa=np.array([1,2,3,4,5],dtype='int32')a輸出結(jié)果:array([1,2,3,4,5],dtype=int8)array([1,2,3,4,5])4.4數(shù)組數(shù)據(jù)類型4.4.3查詢數(shù)據(jù)類型class

Person:

#定義Person類

def

__init__(self,name,age):

self.name=name

self.age=age

zs=Person('張三',18)#產(chǎn)生對象

ls=Person('李四',20)d=np.array([zs,ls])dd.dtype

#dtype屬性表示數(shù)組元素的數(shù)據(jù)類型輸出結(jié)果:array([<__main__.Personobjectat0x00000176CB4F2208>,<__main__.Personobjectat0x00000176CB4F2288>],dtype=object)dtype('O')4.4數(shù)組數(shù)據(jù)類型4.4.4修改數(shù)據(jù)類型f=a.astype('f2')#使用astype改變數(shù)組的數(shù)據(jù)類型,指定唯一標識符f.dtype

輸出結(jié)果:dtype('float16')4.5多維數(shù)組4.5.1數(shù)組維度查詢a1=np.array([1,2,3])a1.ndim

#維度為1a2=np.array([[1,2,3],[4,5,6]])a2.ndim

#維度為2a3=np.array([

[

[1,2,3],

[4,5,6]

],

[

[7,8,9],

[10,11,12]

]])a3.ndim

#維度為34.5多維數(shù)組4.5.2數(shù)組形狀查詢a1=np.array([1,2,3])a1.shape

#

結(jié)果為(3,)a2=np.array([[1,2,3],[4,5,6]])a2.shape

#

結(jié)果為(2,3)a3=np.array([

[

[1,2,3],

[4,5,6]

],

[

[7,8,9],

[10,11,12]

]])a3.shape

#

結(jié)果為(2,2,3)4.5多維數(shù)組4.5.3修改數(shù)組形狀a1=np.array([

[

[1,2,3],

[4,5,6]

],

[

[7,8,9],

[10,11,12]

]])a1a2=a1.reshape((2,6))a2a2.shape

#結(jié)果為(2,

6)a3=a2.flatten()

#

扁平化

(多維數(shù)組轉(zhuǎn)化為一維數(shù)組)a3a3.ndimarray([1,2,3,4,5,6,7,8,9,10,11,12])1輸出結(jié)果:4.5多維數(shù)組4.5.4數(shù)組元素個數(shù)與所占內(nèi)存a1=np.array([

[

[1,2,3],

[4,5,6]

],

[

[7,8,9],

[10,11,12]

]])count=a1.size

#數(shù)組的元素個數(shù)counta1.itemsize

#各元素所占內(nèi)存a1.dtype

#各元素數(shù)據(jù)類型a1.itemsize*a1.size

#數(shù)組所占內(nèi)存4.6數(shù)組索引NumPy數(shù)組的索引方式與Python列表類似,可以使用整數(shù)索引、切片、布爾索引等方式來訪問數(shù)組中的元素。4.6.1下標索引a=np.arange(6)#一維數(shù)組用法和python的列表對象一致#支持從0開始的正整數(shù)下標#也支持從-1開始的負整數(shù)下標a[2]a[-2]#從后往前數(shù)第2個

#二維數(shù)組,提供兩個下標a=np.arange(9).reshape(3,-1)#支持兩種寫法#兩個中括號,第一個為行的下標,第二個為列的下標#一個中括號,兩個下標用逗號分隔a[0][1]a[0,1]輸出結(jié)果:array([0,1,2,3,4,5])24array([[0,1,2],[3,4,5],[6,7,8]])114.6數(shù)組索引4.6.2切片索引a=np.arange(6)a#一維數(shù)組用法和python的列表對象一致a[1:5]a[1:5:2]a[::2]#整個數(shù)組a[::-1]

#二維數(shù)組a=np.arange(9).reshape(3,-1)aa[1:3,1:2]#一個冒號的簡寫表示提取全部的下標#一個省略號的簡寫表示提取全部的下標#提取第二行a[1,:]a[1,...]

#提取第二列a[:,1]

輸出結(jié)果:array([0,1,2,3,4,5])array([1,2,3,4])array([1,3])array([0,2,4])array([5,4,3,2,1,0])array([[0,1,2],[3,4,5],[6,7,8]])array([[4],[7]])array([3,4,5])array([3,4,5])array([1,4,7])4.6數(shù)組索引4.6.3花式索引a=np.arange(6)aa[[1,2,5]]#返回值總是和索引數(shù)組的維度相同a[np.array([(0,1,3),(1,4,5)])]a=np.arange(9).reshape(3,-1)a#根據(jù)索引數(shù)組中的下標提取對應的行a[[1,0]]#一軸為索引數(shù)組,另一軸為下標索引a[[0,2],1]#兩個軸同時為索引數(shù)組,需要使用ix_函數(shù)#第一個數(shù)組中的元素為行對應的下標#第一個數(shù)組中的元素為列對應的下標a[np.ix_([0,1],[0,1])]

輸出結(jié)果:array([0,1,2,3,4,5])array([1,2,5])array([[0,1,3],[1,4,5]])array([[0,1,2],[3,4,5],[6,7,8]])array([[3,4,5],[0,1,2]])array([1,7])array([[0,1],[3,4]])4.6數(shù)組索引4.6.4布爾索引a=np.arange(6)a#一維數(shù)組a>3a[a>3]a=np.arange(9).reshape(3,-1)a#二維數(shù)組a>3a[a>3]輸出結(jié)果:array([0,1,2,3,4,5])array([False,False,False,False,True,True])array([4,5])array([[0,1,2],[3,4,5],[6,7,8]])array([[False,False,False],[False,True,True],[True,True,True]])array([4,5,6,7,8])4.7數(shù)組元素值的替換我們可以使用索引或where函數(shù)來替換NumPy數(shù)組中的元素值。4.7.1方式一:索引a3=np.random.randint(0,10,size=(3,5))#創(chuàng)建數(shù)組元素值為[0,10)隨機數(shù)的3行5列數(shù)組a3a3[1]=0

#將a3數(shù)組第一行數(shù)據(jù)全部更換為0a3a3[1]=np.array([1,2,3,4,5])

#將a3數(shù)組第一行數(shù)據(jù)更換為[1,2,3,4,5]

--

數(shù)據(jù)個數(shù)要對應a3輸出結(jié)果:array([[9,2,7,3,1],[5,3,3,6,3],[3,7,5,4,0]])array([[9,2,7,3,1],[0,0,0,0,0],[3,7,5,4,0]])array([[9,2,7,3,1],[1,2,3,4,5],[3,7,5,4,0]])4.7數(shù)組元素值的替換4.7.2方式二:條件索引a3[a3<3]=1

#數(shù)組中值小于3的元素全部替換為1a3輸出結(jié)果:array([[9,1,7,3,1],[1,1,3,4,5],[3,7,5,4,1]])4.7數(shù)組元素值的替換4.7.3方式三:函數(shù)where()函數(shù)根據(jù)給定的條件返回一個數(shù)組,其中滿足條件的元素被替換為一個值,不滿足條件的元素被替換為另一個值。result=np.where(a3<5,0,1)#將a3數(shù)組中小于5的值替換為0,剩余值替換為1result輸出結(jié)果:array([[1,0,1,0,0],[0,0,0,0,1],[0,1,1,0,0]])4.8數(shù)組的廣播機制4.8數(shù)組的廣播機制4.8.1數(shù)組的廣播原則如果兩個數(shù)組的后緣維度(trailingdimension,即從末尾開始算起的維度)的軸長度相同或其中一方的長度為1,則認為他們是廣播兼容的。廣播會在缺失和(或)長度為1的維度上進行。(1)shape為(3,8,2)的數(shù)組能和(8,3)的數(shù)組進行運算嗎?(2)shape為(3,8,2)的數(shù)組能和(8,1)的數(shù)組進行運算嗎?(3)shape為(3,1,8)的數(shù)組能和(8,1)的數(shù)組進行運算嗎?4.8數(shù)組的廣播機制4.8.2數(shù)組與數(shù)字運算a1=np.random.randint(0,5,size=(3,5))#生成3行5列,值為0-5隨機整數(shù)的數(shù)組a1a1=a1*2.345a1

#數(shù)組中的所有元素都乘以2.345a1.round(2)

#數(shù)組中所有的元素只保留2位小數(shù)輸出結(jié)果(數(shù)字因每次隨機運行而不同)為:array([[0,0,4,3,2],[1,0,2,0,4],[2,3,1,0,1]])array([[0.,0.,9.38,7.035,4.69],[2.345,0.,4.69,0.,9.38],[4.69,7.035,2.345,0.,2.345]])array([[0.,0.,9.38,7.04,4.69],[2.35,0.,4.69,0.,9.38],[4.69,7.04,2.35,0.,2.35]])4.8數(shù)組的廣播機制4.8.3數(shù)組與數(shù)組運算#數(shù)組形狀一致時,各個元素相加減(滿足數(shù)組廣播機制)a1=np.random.randint(0,5,size=(3,5))a2=np.random.randint(0,5,size=(3,5))a1+a2

#形狀不一致的數(shù)組不能相加減(不滿足數(shù)組廣播機制)a3=np.random.randint(0,5,size=(3,4))#a1+a3報錯輸出結(jié)果:array([[5,4,2,3,7],[7,4,4,5,3],[4,5,4,1,2]])4.9數(shù)組形狀的操作4.9.1數(shù)組形狀的改變(1)reshape與resizea1=np.random.randint(0,10,size=(3,4))a1a2=a1.reshape((2,6))#

reshape是將數(shù)組轉(zhuǎn)換成指定的形狀,然后返回轉(zhuǎn)換后的結(jié)果,對于原數(shù)組的形狀是不會發(fā)生改變的a2a1.resize((4,3))#

resize是將數(shù)組轉(zhuǎn)換成指定的形狀,會直接修改數(shù)組本身,并且不會返回任何值a1輸出結(jié)果:array([[7,3,8,1],[2,6,4,1],[5,0,7,3]])array([[7,3,8,1,2,6],[4,1,5,0,7,3]])array([[7,3,8],[1,2,6],[4,1,5],[0,7,3]])4.9數(shù)組形狀的操作4.9.1數(shù)組形狀的改變(2)flatten與ravela3=np.random.randint(0,10,size=(3,4))a3a4=a3.flatten()#

flatten是將數(shù)組轉(zhuǎn)換為一維數(shù)組后,然后將這個拷貝返回回去,然后后續(xù)對這個返回值進行修改不會影響之前的數(shù)組a4a4[0]=100a3[0,0]

#之前的數(shù)組不受影響a4[0]a5=a3.ravel()#

ravel是將數(shù)組轉(zhuǎn)換為一維數(shù)組后,將這個視圖(引用)返回回去,后續(xù)對這個返回值進行修改會影響之前的數(shù)組a5a5[0]=100a3[0,0]

#之前的數(shù)組同時被更新了a5[0]輸出結(jié)果:array([[6,9,1,6],[4,9,4,8],[7,0,6,0]])array([6,9,1,6,4,9,4,8,7,0,6,0])6100array([6,9,1,6,4,9,4,8,7,0,6,0])1001004.9數(shù)組形狀的操作4.9.2數(shù)組的疊加(1)垂直方向疊加的兩種方式v1=np.random.randint(0,10,size=(3,4))v1v2=np.random.randint(0,10,size=(2,4))v2#垂直方向疊加的兩種方式v3=np.vstack([v1,v2])v3v4=np.concatenate([v1,v2],axis=0)v4輸出結(jié)果:array([[6,0,6,5],[9,6,4,9],[3,9,4,6]])array([[8,8,9,9],[9,2,5,1]])array([[6,0,6,5],[9,6,4,9],[3,9,4,6],[8,8,9,9],[9,2,5,1]])array([[6,0,6,5],[9,6,4,9],[3,9,4,6],[8,8,9,9],[9,2,5,1]])4.9數(shù)組形狀的操作4.9.2數(shù)組的疊加(2)水平方向疊加的兩種方式h1=np.random.randint(0,10,size=(3,4))h1h2=np.random.randint(0,10,size=(3,1))h2#水平方向疊加的兩種方式h3=np.hstack([h1,h2])h3h4=np.concatenate([h1,h2],axis=1)h4輸出結(jié)果:array([[5,0,8,6],[8,5,1,8],[4,3,6,3]])array([[4],[5],[3]])array([[5,0,8,6,4],[8,5,1,8,5],[4,3,6,3,3]])array([[5,0,8,6,4],[8,5,1,8,5],[4,3,6,3,3]])4.9數(shù)組形狀的操作4.9.2數(shù)組的疊加(3)先將數(shù)據(jù)拉轉(zhuǎn)換成一維向量,再拼接np.random.seed(42)#設置隨機種子

h1

=

np.random.randint(0,10,size=(3,4))h1h2

=

np.random.randint(0,10,size=(3,1))h2#先識別垂直疊加或水平疊加,后轉(zhuǎn)換為一維數(shù)組h5

=

np.concatenate([h1,h2],axis=None)h5輸出結(jié)果:array([[6,3,7,4],[6,9,2,6],[7,4,3,7]])array([[7],[2],[5]])array([6,3,7,4,6,9,2,6,7,4,3,7,7,2,5])4.9數(shù)組形狀的操作4.9.3數(shù)組的切割(1)水平方向切割np.random.seed(42)#設置隨機種子

hs1

=

np.random.randint(0,10,size=(3,4))hs1np.hsplit(hs1,2)

#水平方向平均分為2份(要求列數(shù)可被此數(shù)整除)np.hsplit(hs1,(1,2))

#水平方向分為1,1,2列(在下標為1,2處切割)4.9數(shù)組形狀的操作4.9.3數(shù)組的切割(1)水平方向切割輸出結(jié)果:array([[6,3,7,4],[6,9,2,6],[7,4,3,7]])[array([[6,3],[6,9],[7,4]]),array([[7,4],[2,6],[3,7]])][array([[6],[6],[7]]),array([[3],[9],[4]]),array([[7,4],[2,6],[3,7]])]4.9數(shù)組形狀的操作4.9.3數(shù)組的切割(2)垂直方向切割np.random.seed(42)#設置隨機種子

vs1=np.random.randint(0,10,size=(4,5))vs1np.vsplit(vs1,4)

#垂直方向平均分為4份np.vsplit(vs1,(1,3))

#垂直方向分為1,2,1行4.9數(shù)組形狀的操作4.9.3數(shù)組的切割(2)垂直方向切割輸出結(jié)果:array([[6,3,7,4,6],[9,2,6,7,4],[3,7,7,2,5],[4,1,7,5,1]])[array([[6,3,7,4,6]]),array([[9,2,6,7,4]]),array([[3,7,7,2,5]]),array([[4,1,7,5,1]])][array([[6,3,7,4,6]]),array([[9,2,6,7,4],[3,7,7,2,5]]),array([[4,1,7,5,1]])]4.9數(shù)組形狀的操作4.9.3數(shù)組的切割(3)指定切割方式hs1np.split(hs1,4,axis=1)

#按列平均切割vs1np.split(vs1,4,axis=0)

#按行平均切割4.9數(shù)組形狀的操作4.9.3數(shù)組的切割(3)指定切割方式輸出結(jié)果:array([[1,2,7,9],[9,7,7,8],[3,1,2,6]])[array([[1],[9],[3]]),array([[2],[7],[1]]),array([[7],[7],[2]]),array([[9],[8],[6]])]array([[1,3,9,3,4],[4,1,6,1,2],[0,3,2,3,0],[2,7,9,8,0]])[array([[1,3,9,3,4]]),array([[4,1,6,1,2]]),array([[0,3,2,3,0]]),array([[2,7,9,8,0]])]4.9數(shù)組形狀的操作4.9.4矩陣轉(zhuǎn)置(1)通過ndarray.T進行轉(zhuǎn)置t1=np.random.randint(0,10,size=(3,4))t1t1.T

#數(shù)組t1轉(zhuǎn)置t1.dot(t1.T)

#矩陣相乘

輸出結(jié)果:array([[1,5,9,8],[0,0,6,7],[2,4,1,9]])array([[1,0,2],[5,0,4],[9,6,1],[8,7,9]])array([[171,110,103],[110,85,69],[103,69,102]])4.9數(shù)組形狀的操作4.9.4矩陣轉(zhuǎn)置(2)通過ndarray.transpose()進行轉(zhuǎn)置t2=t1.transpose()t2t2[0,0]=99

#修改會影響原來的數(shù)組t1輸出結(jié)果:array([[1,0,2],[5,0,4],[9,6,1],[8,7,9]])array([[99,5,9,8],[0,0,6,7],[2,4,1,9]])4.10Axis理解在NumPy中,axis是指數(shù)組的某個維度,用于指定對數(shù)組進行操作時沿著哪個維度進行操作。4.10.1Axisaxis用于指定軸是行還是列,axis默認是0。axis=0代表縱向合并;axis=1代表橫向合并,如圖4.2所示。4.10Axis理解4.10.1Axis(1)求x數(shù)組在axis=0和axi

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 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

提交評論