




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第1章NumPy數(shù)值計算基礎(chǔ)全套可編輯PPT課件2Numpy數(shù)據(jù)集的讀取與存儲方法1Numpy環(huán)境配置3Numpy數(shù)據(jù)選擇4Numpy數(shù)據(jù)集生成5Numpy切片6Numpy矩陣運算1.1:Numpy環(huán)境配置認識Numpy下載安裝什么是numpyNumPy的全稱是“NumericPython”,它是Python的第三方擴展包,主要用來計算、處理一維或多維數(shù)組。在數(shù)組算術(shù)計算方面,NumPy提供了大量的數(shù)學函數(shù)。NumPy的底層主要用C語言編寫,因此它能夠高速地執(zhí)行數(shù)值計算。NumPy還提供了多種數(shù)據(jù)結(jié)構(gòu),這些數(shù)據(jù)結(jié)構(gòu)能夠非常契合的應(yīng)用在數(shù)組和矩陣的運算上。NumPy的前身是Numeric程序包,該包由JimHugunin開發(fā),在這之后,他還開發(fā)了另一個類似的的程序包Numarray,相比前者而言Numarray具有更加全面的功能。在2005年,TravisOliphant通過整合Numarray與Numeric軟件包的功能,從而集成了NumPy。NumPy的最新版本1.19.2已于2020年9月10日發(fā)布。認識numpyNumPy使用需求隨著數(shù)據(jù)科學(DataScience,簡稱DS,包括大數(shù)據(jù)分析與處理、大數(shù)據(jù)存儲、數(shù)據(jù)抓取等分支)的蓬勃發(fā)展,像NumPy、SciPy(Python科學計算庫)、Pandas(基于NumPy的數(shù)據(jù)處理庫)等數(shù)據(jù)分析庫都有了大量的增長,它們都具有較簡單的語法格。在矩陣乘法與數(shù)組形狀處理上,NumPy有著非常不錯的性能,再加上NumPy的計算速度很快,這些都是NumPy成為一款數(shù)據(jù)分析工具的重要原因。NumPy可以很便捷高效地處理大量數(shù)據(jù),那么使用NumPy做數(shù)據(jù)處理有哪些優(yōu)點呢?NumPy是Python科學計算基礎(chǔ)庫;NumPy可以對數(shù)組進行高效的數(shù)學運算;NumPy的ndarray對象可以用來構(gòu)建多維數(shù)組;NumPy能夠執(zhí)行傅立葉變換與重塑多維數(shù)組形狀;NumPy提供了線性代數(shù),以及隨機數(shù)生成的內(nèi)置函數(shù)。認識numpyNumPy應(yīng)用場景NumPy通常與SciPy(Python科學計算庫)和Matplotlib(Python繪圖庫)等軟件包組合使用,這種組合方式被用來廣泛地代替MatLab的使用。MatLab是一款強大的數(shù)學計算軟件,廣泛應(yīng)用在數(shù)據(jù)分析、電子通信、深度學習、圖像處理、機器視覺、量化金融等領(lǐng)域,但近些年隨著Python語言的迅猛發(fā)展,Python被看作是一種更適合代替MatLab的編程語言。您可以使用NumPy、SciPy與Matplotlib等Python工具包搭建科學計算環(huán)境,比如Anaconda就是是一個開源的Python發(fā)行版本,它包含了Python、NumPy等180多個科學包及其依賴項。認識numpyNumPy是Python的第三方擴展包,但它并沒有包含在Python標準庫中,因此需要單獨安裝它。Windows系統(tǒng)安裝使用Python包管理器pip來安裝NumPy,是一種最簡單、最輕量級的方法。只需執(zhí)行以下命令即可:
pipinstallnumpy
以上命令是在安裝了python安裝包,進入cmd下輸入命令執(zhí)行
下載安裝安裝成功打開Python交互解釋器(或Jupyter,推薦!),并導(dǎo)入NumPy模塊,如下圖所示如果未出現(xiàn)錯誤提示,則表示已安裝成功。下載安裝In[1]:import
numpy
as
np
#導(dǎo)入NumPy并指定別名npIn[2]:print(np.__version__) #輸出NumPy的版本號1.19.5如果安裝的是Anaconda點擊ancondaprompt直接執(zhí)行piplist或者condalist查看numpy,一般都有安裝,不用從新安裝下載安裝1.2:N維數(shù)組的本質(zhì)
NumPy數(shù)組的兩種視圖1.3
N維數(shù)組的本質(zhì)ndarray對象數(shù)組類型數(shù)組屬性創(chuàng)建ndarray對象通過NumPy的內(nèi)置函數(shù)array()可以創(chuàng)建ndarray對象,其語法格式如下:numpy.array(object,dtype=None,copy=True,order=None,ndmin=0)ndarray對象數(shù)組的常用屬性
ndarray對象:dtype
In[1]:import
numpy
as
np
#導(dǎo)入Numpy軟件包In[2]:my_array=np.arange(0,10) #創(chuàng)建一個取值范圍為0~9的一維數(shù)組序列In[3]:my_array.dtype#查看數(shù)組元素的類型Out[3]:dtype('int64')查看數(shù)組類型ndarray對象
In[4]:type(my_array) #查看對象的類型Out[4]:numpy.ndarrayIn[5]:my_array.__class__ #等價于查看構(gòu)建對象所用的類的名稱Out[5]:numpy.ndarrayndarray.ndim屬性返回的是數(shù)組的維數(shù)代碼如下:
數(shù)組屬性In[6]:my_array.ndim
#顯示數(shù)組的維度Out[6]:1ndarray.shape數(shù)組屬性In[7]:my_array.shape
#查看數(shù)組的尺寸Out[7]:(10,)
數(shù)組的reshapeIn[8]:arr=np.arange(15) #創(chuàng)建一個包含15個元素的一維數(shù)組In[9]:arr #查看一維數(shù)組的數(shù)據(jù)Out[9]:array([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14])In[10]:arr=arr.reshape(3,5) #改變數(shù)組尺寸為3行5列In[11]:arr #顯示二維數(shù)組元素Out[11]:array([[0,1,2,3,4],[5,6,7,8,9],[10,11,12,13,14]])In[12]:arr.ndim
#查看數(shù)組的維度信息Out[12]:2
#這是一個二維數(shù)組或稱2D張量In[13]:arr.shape
#查看數(shù)組的形狀信息Out[13]:(3,5)我們也可以直接對數(shù)組的shape屬性進行賦值,來“重構(gòu)”數(shù)組的形狀。例如,b.shape=3,5。需要注意的是,等號右邊的兩個離散的尺寸“3,5”被Python自動打包為元組,變?yōu)?3,5)。因此前面的語句等價為b.shape=(3,5)。二維數(shù)組In[16]:arr=arr.astype('float32')
#將數(shù)組arr強制轉(zhuǎn)為32位浮點數(shù)In[17]:arr #驗證輸出Out[17]:array([[0.,1.,2.,3.,4.],[5.,6.,7.,8.,9.],[10.,11.,12.,13.,14.]],dtype=float32)In[18]:arr.itemsize
#再次驗證數(shù)組arr中每個元素占用的字節(jié)數(shù)Out[18]:4讀者可對比Out[3]處的輸出。3維數(shù)組In[19]:arr2=np.arange(30).reshape(2,3,5) #重構(gòu)數(shù)組為2通道3行5列In[20]:arr2 Out[20]: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],
[25,26,27,28,29]]])In[21]:arr2.shape #輸出驗證arr2的尺寸Out[21]:(2,3,5)
1.4如何生成NumPy數(shù)組創(chuàng)建數(shù)組方法數(shù)組操作數(shù)組的增刪改查利用序列生成In[1]:import
numpy
as
np
#導(dǎo)入NumPy軟件包In[2]:data1=[6,8.5,9,0] #構(gòu)建一個列表In[3]:arr1=np.array(data1) #列表充當數(shù)組的數(shù)據(jù)源In[4]:arr1 #輸出驗證Out[4]:array([6.,8.5,9.,0.])In[5]:arr1.dtype #默認保存為雙精度(64bit)浮點數(shù)Out[5]:dtype('float64')利用序列生成In[6]:arr1_int=arr1.astype(np.int32) #轉(zhuǎn)換為32位整型數(shù)In[7]:arr1_int #輸出驗證Out[7]:array([6,8,9,0],dtype=int32)In[10]:data2=[[1,2,3,4],[5,6,7,8]]#這是一個兩層嵌套列表In[10]:arr2=np.array(data2)#轉(zhuǎn)換為一個二維數(shù)組In[11]:arr2Out[11]:array([[1,2,3,4],[5,6,7,8]])利用序列生成In[1]:import
numpy
as
np
#導(dǎo)入NumPy軟件包In[2]:data1=[6,8.5,9,0] #構(gòu)建一個列表In[3]:arr1=np.array(data1) #列表充當數(shù)組的數(shù)據(jù)源In[4]:arr1 #輸出驗證Out[4]:array([6.,8.5,9.,0.])In[5]:arr1.dtype #默認保存為雙精度(64bit)浮點數(shù)Out[5]:dtype('float64')numpy.arange()在NumPy中,您可以使用arange()來創(chuàng)建給定數(shù)值范圍的數(shù)組,語法格式如下:numpy.arange(start,stop,step,dtype)創(chuàng)建數(shù)組的方法利用特定方法生成
1.
arange(start,stop,step,dtype)arange根據(jù)start與stop指定的范圍及step設(shè)定的步長生成一個ndarray對象。start為起始值,默認為0;stop為終止值。取值區(qū)間是左閉右開的,即stop這個終止值是不包括在內(nèi)的。step為步長,如果不指定,默認值為1。
In[1]:import
numpy
as
npIn[2]:arr3=np.arange(10)#生成從0~9的ndarray數(shù)組In[3]:print(arr3)[0
1
2
3
4
5
6
7
8
9]rang和arange(np)In[8]:np.arange(0,10,0.5) #步長設(shè)置為0.5Out[8]:array([0.,0.5,1.,1.5,2.,2.5,3.,3.5,4.,4.5,5.,5.5,6.,
6.5,7.,7.5,8.,8.5,9.,9.5])
In[9]:range(0,10,0.5)
#錯誤,range的步長必須是整數(shù)----------------------------------------------------------------------TypeErrorTraceback(mostrecentcalllast)<ipython-input-9-eeb741842f02>
in
<module>---->
1
range(0,10,.5)TypeError:'float'
objectcannotbeinterpretedasaninteger利用linspace
In[10]:array=np.linspace(1,10,20)In[11]:print(array)[1.
1.47368421
1.94736842
2.42105263
2.89473684
3.36842105
3.84210526
4.31578947
4.78947368
5.26315789
5.73684211
6.21052632
6.68421053
7.15789474
7.63157895
8.10526316
8.57894737
9.05263158
9.52631579
10.]numpy.linspace(start,
stop,
num=50,
endpoint=True,
retstep=False,
dtype=None,
axis=0)[source]Returnevenlyspacednumbersoveraspecifiedinterval.Returns
num
evenlyspacedsamples(區(qū)間等分),calculatedovertheinterval[start,
stop].Theendpointoftheintervalcanoptionallybeexcluded.numpy.zeros()該函數(shù)用來創(chuàng)建元素均為0的數(shù)組,同時還可以指定被數(shù)組的形狀,語法格式如下:numpy.zeros(shape,dtype=float,order="C")創(chuàng)建數(shù)組的方法創(chuàng)建數(shù)組的方法:zeros創(chuàng)建ndarray數(shù)組的基本方法,除了使用array()方法外,NumPy還提供了其他創(chuàng)建ndarray數(shù)組的方法。numpy.empty()numpy.empty()創(chuàng)建未初始化的數(shù)組,可以指定創(chuàng)建數(shù)組的形狀(shape)和數(shù)據(jù)類型(dtype),語法格式如下:numpy.empty(shape,dtype=float,order='C')它接受以下參數(shù):shape:指定數(shù)組的形狀;dtype:數(shù)組元素的數(shù)據(jù)類型,默認值是值float;order:指數(shù)組元素在計算機內(nèi)存中的儲存順序,默認順序是“C”(行優(yōu)先順序)。利用特定方法生成代碼如下:創(chuàng)建數(shù)組的方法importnumpyasnparr=np.empty((3,2),dtype=int)print(arr)輸出結(jié)果:[[2003134838175335712][538976288538976288][19705624181684369010]]可以看到,numpy.empty()返回的數(shù)組帶有隨機值,但這些數(shù)值并沒有實際意義。切記empty并非創(chuàng)建空數(shù)組。numpy.ones()返回指定形狀大小與數(shù)據(jù)類型的新數(shù)組,并且新數(shù)組中每項元素均用1填充,語法格式如下:numpy.ones(shape,dtype=None,order='C')創(chuàng)建數(shù)組的方法importnumpyasnparr1=np.ones((3,2),dtype=int)print(arr1)輸出結(jié)果如下:[[11][11][11]1.5
NumPy中的隨機數(shù)生成范例1-1NumPy中的random模塊01importnumpyasnp
#導(dǎo)入NumPy03rdm=np.random.RandomState() #定義種子類04#np.random.seed(19680101) #定義全局種子,與上面的取一種即可06#生成2×3的二維隨機數(shù)組,隨機數(shù)均勻分布,有幾個參數(shù)就生成幾維數(shù)據(jù)07rand=np.random.rand(2,3)08print("rand(d0,d1,...,dn):產(chǎn)生服從均勻分布的隨機數(shù)\n",rand)10randn=np.random.randn(2,3) #生成2×3的二維隨機數(shù)組,隨機數(shù)服從標準正態(tài)分布11print("randn(d0,d1,...,dn):產(chǎn)生標準正態(tài)分布的隨機數(shù)\n",randn)13randint=np.random.randint(1,10,(2,3)) #生成2×3的1~10范圍內(nèi)的隨機整數(shù)14print("randint(low,high,size,dtype):產(chǎn)生隨機整數(shù)\n",randint)16random=np.random.random((2,3))17print("random(size):在[0,1)內(nèi)產(chǎn)生隨機數(shù)\n",random)運行結(jié)果rand(d0,d1,...,dn):產(chǎn)生均勻分布的隨機數(shù)[[0.87057637
0.05929263
0.3380323][0.40045436
0.83160874
0.57788488]]randn(d0,d1,...,dn):產(chǎn)生標準正態(tài)分布的隨機數(shù)[[-1.45930643
-0.5270492
0.75118004][0.88328798
-0.63944759
0.77902815]]randint(low,high,size,dtype):產(chǎn)生隨機整數(shù)[[9
8
2][4
6
5]]random(size):在[0,1)內(nèi)產(chǎn)生隨機數(shù)[[0.10403689
0.58242245
0.52686065][0.43098811
0.9953507
0.61691354]]1.6NumPy數(shù)組中的運算
向量運算In[1]:list1=[1,2,3,4,5,6,7,8,9,10]In[2]:list2=[11,12,13,14,15,16,17,18,19,20]列表推導(dǎo)式
對應(yīng)元素的和
In[3]:list3=[item1+item2foritem1,item2in
zip(list1,list2)]In[4]:list3Out[4]:[12,14,16,18,20,22,24,26,28,30]NumPy對列表元素求和In[5]:list1_arr=np.array(list1) #將list1轉(zhuǎn)換成ndarrayIn[6]:list2_arr=np.array(list2) #將list2轉(zhuǎn)換成ndarrayIn[7]:list_sum=list1_arr+list2_arr #求和In[8]:print(list_sum)Out[8]:[12,14,16,18,20,22,24,26,28,30]1.6.2
NumPy中的通用函數(shù)表1-1NumPy中部分常用的通用函數(shù)
函數(shù)名稱函數(shù)功能add、subtract、multiplydivide逐元素進行兩個序列對應(yīng)的加、減、乘、除操作matmul計算兩個數(shù)組的矩陣積sqrt以元素方式返回數(shù)組的非負平方根power第一個數(shù)組元素從第二個數(shù)組提升為冪,按元素排序sin、cos、tan計算三角函數(shù)的正弦、余弦、正切abs計算序列化數(shù)據(jù)的絕對值log、log2、logl0 計算輸入數(shù)組的對數(shù),分別為自然對數(shù)、以2為底的對數(shù)、以10為底的對數(shù)exp、exp2計算輸入數(shù)組中所有元素的指數(shù)cumsum、cumproduct累計求和、求積sum 對一個序列化數(shù)據(jù)進行求和mean、median計算均值、計算中位數(shù)std、var 計算標準差、計算方差corrcoef計算相關(guān)系數(shù)tensor
in,tensor
outufunc函數(shù)的相關(guān)示例
In[1]:import
numpy
as
np
In[2]:A=np.ones(3)*
1 #張量A的值為[1.,1.,1.]In[3]:B=np.ones(3)*
2 #張量B的值為[2.,2.,2.]In[4]:C=np.add(A,B)In[5]:print(C) #驗證張量C的值[3.
3.
3.]In[6]:np.add(A,B,out=B)In[7]:print(B)[3.
3.
3.]NumPy數(shù)組的“加減乘除”算術(shù)運算add()、subtract()函數(shù)multiple()、divide()函數(shù)注意:做算術(shù)運算時,輸入數(shù)組必須具有相同的形狀,或者符合數(shù)組的廣播規(guī)則,才可以執(zhí)行運算。算術(shù)運算逐元素矩陣乘法multiple()函數(shù)用于兩個矩陣的逐元素乘法,如下:矩陣算法importnumpyasnparray1=np.array([[1,2,3],[4,5,6],[7,8,9]],ndmin=3)array2=np.array([[9,8,7],[6,5,4],[3,2,1]],ndmin=3)result=np.multiply(array1,array2)result輸出結(jié)果:array([[[9,16,21],[24,25,24],[21,16,9]]])逐元素運算與點乘運算
In[1]:import
numpy
as
np
In[2]:a=np.arange(10) #生成一維ndarray數(shù)組,長度為10In[3]:b=np.linspace(1,10,10) #生成一維ndarray數(shù)組,長度為10In[4]:a #輸出驗證Out[4]:array([0,1,2,3,4,5,6,7,8,9])In[5]:b #輸出驗證Out[5]:array([1.,2.,3.,4.,5.,6.,7.,8.,9.,10.])In[6]:a+b #對數(shù)組做加法運算Out[6]:array([1.,3.,5.,7.,9.,11.,13.,15.,17.,19.])In[7]:a-b #對數(shù)組做減法運算Out[7]:array([-1.,-1.,-1.,-1.,-1.,-1.,-1.,-1.,-1.,-1.])In[8]:a*b #對數(shù)組做乘法運算Out[8]:array([0.,2.,6.,12.,20.,30.,42.,56.,72.,90.])NumPy數(shù)組的“加減乘除”算術(shù)運算add()、subtract()函數(shù)multiple()、divide()函數(shù)注意:做算術(shù)運算時,輸入數(shù)組必須具有相同的形狀,或者符合數(shù)組的廣播規(guī)則,才可以執(zhí)行運算。算術(shù)運算逐元素運算與點乘運算
In[9]:a/b #對數(shù)組做除法運算Out[9]:array([0.,0.5,0.66666667,0.75,0.8,
0.83333333,0.85714286,0.875,0.88888889,0.9])In[10]:a%b #對數(shù)組做取余運算Out[10]:array([0.,1.,2.,3.,4.,5.,6.,7.,8.,9.])In[11]:a**
2
#對數(shù)組做平方運算Out[11]:array([0,1,4,9,16,25,36,49,64,81])1.6.4向量的內(nèi)積與矩陣乘法矩陣乘法是將兩個矩陣作為輸入值,并將A矩陣的行與B矩陣的列對應(yīng)位置相乘再相加,從而生成一個新矩陣.矩陣乘法運算被稱為向量化操作,向量化的主要目的是減少使用的for循環(huán)次數(shù)或者根本不使用。這樣做的目的是為了加速程序的計算。矩陣乘法注意:必須確保第一個矩陣中的行數(shù)等于第二個矩陣中的列數(shù),否則不能進行矩陣乘法運算。向量的內(nèi)積與矩陣乘法
In[12]:a=np.array([1,2,3])In[13]:b=np.array([4,5,6])In[14]:np.dot(a,b)Out[14]:32矩陣乘法In[15]:a=np.arange(9).reshape(3,3)In[16]:a #輸出驗證Out[16]:array([[0,1,2],[3,4,5],[6,7,8]])In[17]:b=np.ones(shape=(3,2))In[18]:b #輸出驗證Out[18]:array([[1.,1.],[1.,1.],[1.,1.]])In[19]:np.dot(a,b)#矩陣乘積Out[19]:array([[3.,3.],[12.,12.],[21.,21.]])1.7NumPy中的廣播機制
NumPy中的廣播機制(Broadcast)旨在解決不同形狀數(shù)組之間的算術(shù)運算問題。我們知道,如果進行運算的兩個數(shù)組形狀完全相同,它們直接可以做相應(yīng)的運算。廣播機制但如果兩個形狀不同的數(shù)組呢?它們之間就不能做算術(shù)運算了嗎?當然不是!為了保持數(shù)組形狀相同,NumPy設(shè)計了一種廣播機制,這種機制的核心是對形狀較小的數(shù)組,在橫向或縱向上進行一定次數(shù)的重復(fù),使其與形狀較大的數(shù)組擁有相同的維度。廣播機制當進行運算的兩個數(shù)組形狀不同,Numpy會自動觸發(fā)廣播機制。代碼如下:importnumpyasnpa=np.array([[0,0,0],[10,10,10],[20,20,20],[30,30,30]])#b數(shù)組與a數(shù)組形狀不同b=np.array([1,2,3])print(a+b)輸出結(jié)果為:[[123][111213][212223][313233]]“低維有1”情況下的廣播In[1]:import
numpy
as
npIn[2]:x=np.array([1,2,3])In[3]:y=
2In[4]:x.shapeOut[4]:(3,)In[5]:x+yOut[5]:array([3,4,5])“后緣相符”情況下的廣播In[6]:a=np.array([[0,0,0],
[1,1,1],
[2,2,2],
[3,3,3]])In[7]:b=np.array([1,2,3])In[8]:a.shapeOut[8]:(4,3)In[9]:b.shapeOut[9]:(3,)In[10]:a+bOut[10]:array([[1,2,3],
[2,3,4],
[3,4,5],
[4,5,6]])“后緣不符但低維有1”情況下的廣播In[11]:c=np.arange(3).reshape((3,1))In[12]:c.shapeOut[12]:(3,1)In[13]:d=np.arange(3)In[14]:d.shapeOut[14]:(3,)In[15]:c+dOut[15]:array([[0,1,2],
[1,2,3],
[2,3,4]])思考:廣播失敗的原因In[16]:arr1=np.array([[0.0,0.0,0.0],#shape:(4,3)[10.0,10.0,10.0],[20.0,20.0,20.0],[30.0,30.0,30.0]])In[17]:arr2=np.array([0,1,2,3]) #shape:(4,)In[18]:arr1+arr2
#是否會廣播成功?小結(jié):廣播的特征
后緣相符:如果兩個向量在維度上不相符,只要維度尾部對齊相符,則廣播就可以得以發(fā)生。
低維有1:如果兩個向量的尺寸在維度上不匹配,但有一個向量后緣維度為1,則需要將維度低的向量進行拉伸,以匹配另一個較大向量的尺寸。
擴展維度:在符合廣播條件的前提下,廣播機制會為尺寸較小的向量添加一個軸(廣播軸),使其維度信息與較大向量的維度信息相同。
復(fù)制數(shù)據(jù):尺寸較小的向量沿著新添加的軸不斷重復(fù)之前的元素,直至尺寸與較大的向量相同。1.8NumPy中的軸認識軸的概念基于軸的約減操作In[1]:import
numpy
as
np
In[2]:a=np.ones((2,3)) #創(chuàng)建形狀為2×3、元素值均為1的矩陣In[3]:a#顯示該矩陣Out[3]:array([[1.,1.,1.],[1.,1.,1.]])In[4]:a.sum()#將6個矩陣元素求和后轉(zhuǎn)換成一個元素Out[4]:6.0In[5]:a.sum(axis=
0)#垂直方向約減Out[5]:array([2.,2.,2.])In[6]:a.sum(1)
#垂直方向約減Out[6]:array([3.,3.])基于軸的各種運算In[7]:a=np.array([[[1,1,1],[2,2,2]],[[3,3,3],[4,4,4]]])In[8]:a#輸出驗證Out[8]:array([[[1,1,1],
[2,2,2]],[[3,3,3],
[4,4,4]]])In[9]:a.sum(axis=
0)#在第0個軸方向進行約減求和Out[9]:array([[4,4,4],
[6,6,6]])In[10]:a.sum(axis=
1)Out[10]:array([[3,3,3],
[7,7,7]])In[11]:a.ndim#查看張量a的維度Out[11]:3In[12]:b=a.sum(axis=
2) #在第2個軸上約減In[13]:bOut[13]:array([[3,6],
[9,12]])In[14]:b.ndim#查看被約減后張量b的維度Out[14]:2
1.9操作數(shù)組元素在NumPy中,如果想要訪問,或修改數(shù)組中的元素,您可以采用索引或切片的方式,比如使用從0開始的索引依次訪問數(shù)組中的元素,這與Python的list列表是相同的。NumPy提供了多種類型的索引方式,常用方式有兩種:基本切片與高級索引(第二章講解)。切片1.9.1通過索引訪問數(shù)組元素In[1]:import
numpy
as
npIn[2]:one_dim=np.linspace(-0.5,0.6,5)In[3]:print(one_dim)[-0.5
-0.225
0.05
0.325
0.6]In[4]:one_dim[0] #訪問第1個元素Out[4]:-0.5In[5]:one_dim[-1] #訪問倒數(shù)第1個元素Out[5]:0.6In[6]:one_dim[0]=
1
#對第1個元素賦值二維數(shù)組的索引下標訪問In[8]:two_dim=np.array([[1,2,3],#構(gòu)造一個二維數(shù)組[4,5,6],[7,8,9]])In[9]:two_dim[0][2]
#訪問第1行第3列對應(yīng)的元素Out[9]:3In[10]:two_dim[0,2]
#NumPy風格的二維數(shù)組訪問Out[10]:3在NumPy中,如果想要訪問,或修改數(shù)組中的元素,您可以采用索引或切片的方式,比如使用從0開始的索引依次訪問數(shù)組中的元素,這與Python的list列表是相同的。NumPy提供了多種類型的索引方式,常用方式有兩種:基本切片與高級索引。切片一維數(shù)組的切片NumPy內(nèi)置函數(shù)slice()可以用來構(gòu)造切片對象,該函數(shù)需要傳遞三個參數(shù)值分別是start(起始索引)、stop(終止索引)和step(步長),通過它可以實現(xiàn)從原數(shù)組的上切割出一個新數(shù)組。1.9.2
NumPy中的切片訪問importnumpyasnpa=np.arange(10)#生成切片對象s=slice(2,9,3)#從索引2開始到索引9停止,間隔時間為2print(a[s])輸出結(jié)果:[258]1.9.2
NumPy中的切片訪問In[1]:import
numpy
as
np
In[2]:a=np.arange(10)In[3]:s=
slice(0,9,2) #創(chuàng)建切片對象In[4]:b=a[s] #按照切片規(guī)則提取數(shù)據(jù)In[5]:bOut[5]:array([0,2,4,6,8])In[6]:a#驗證:原始數(shù)組并不受切片影響Out[6]:array([0,1,2,3,4,5,6,7,8,9])一維數(shù)組的切片也可以通過冒號來分割切片參數(shù),最終也能獲得相同結(jié)果切片importnumpyasnpa=np.arange(10)b=a[2:9:2]print(b)輸出結(jié)果:[258]1.9.2
NumPy中的切片訪問In[7]:a[0:9:2]Out[7]:array([0,2,4,6,8])In[8]:a#驗證:原始數(shù)組并不受切片影響Out[8]:array([0,1,2,3,4,5,6,7,8,9])切片語法:數(shù)組名[start:end:step]。start表示起始索引(從0計數(shù)),end表示結(jié)束索引(-1表示結(jié)束),step表示步長,步長為正時表示從左向右取值,步長為負時則反向取值。
1.9.2
NumPy中的切片訪問In[9]:a[2:]#從第2到結(jié)尾的所有元素Out[9]:array([2,3,4,5,6,7,8,9])In[10]:a[2:-2]#從第2個元素開始,到倒數(shù)第2個元素結(jié)束(但不包括倒數(shù)第2個元素)Out[10]:array([2,3,4,5,6,7])一維數(shù)組的切片下面對冒號切片做簡單地說明:如果僅輸入一個參數(shù),則將返回與索引相對應(yīng)的元素。對于上述示例來說[3]就會返回3。如果在其前面插入“:”如[:9],則會返回0-8的所有數(shù)字(不包含9)。如是[2:]則會返回2-9之間的數(shù)字。如果在兩個參數(shù)之間,如[2:9],則對兩個索引值之間的所有元素進行切片(不包括停止索引)。切片多維數(shù)組切片切片importnumpyasnpa=np.array([[1,2,3],[3,4,5],[4,5,6]])print(a)#從[1:]索引處開始切割print(a[1:])輸出結(jié)果:[[123][345][456]]#切割后的新數(shù)組[[345][456]]表1-2切片操作的省略方式
切片參數(shù)含義描述start:end:step從start開始讀取,到end(不包含end)結(jié)束,步長為stepstart:end從start開始讀取,到end(不包含end)結(jié)束,步長為1start:從start開始讀取后續(xù)所有元素,步長為1start::step從start開始讀取后續(xù)所有元素,步長為step:end:step從0開始讀取,到end(不包含end)結(jié)束,步長為step:end從0開始讀取,到end(不包含end)結(jié)束,步長為1::step從0開始讀取后續(xù)所有元素,步長為step::讀取所有元素:讀取所有元素In[11]:a[::-1]#從開始到結(jié)束,步長為-1Out[11]:array([9,8,7,6,5,4,3,2,1,0])#對數(shù)組進行翻轉(zhuǎn)輸出實例:切片1.9.3
二維數(shù)組的轉(zhuǎn)置與展平
NumPy中包含了一些處理數(shù)組的常用方法,大致可分為以下幾類:1、數(shù)組變維操作2、數(shù)組轉(zhuǎn)置操作3、修改數(shù)組維度操作4、連接與分割數(shù)組操作二維數(shù)組的轉(zhuǎn)置與展平
數(shù)組變維操作數(shù)組操作numpy.ndarray.flatnumpy.ndarray.flat返回一個數(shù)組迭代器,代碼如下:數(shù)組操作importnumpyasnpa=np.arange(9).reshape(3,3)forrowina:print(row)#使用flat屬性:foreleina.flat:print(ele,end=",")輸出結(jié)果如下:#原數(shù)組[012][345][678]#輸出元素0,1,2,3,4,5,6,7,8,numpy.ndarray.flatten()numpy.ndarray.flatten返回一份數(shù)組副本,對副本修改不會影響原始數(shù)組,其語法格式如下:數(shù)組操作ndarray.flatten(order='C')importnumpyasnpa=np.arange(8).reshape(2,4)print(a)#默認按行C風格展開的數(shù)組print(a.flatten())#以F風格順序展開的數(shù)組print(a.flatten(order='F'))輸出結(jié)果:#數(shù)組a[[0123][4567]]#默認c順序站看數(shù)組[01234567]#F順序站看數(shù)組[04152637]numpy.ravel()numpy.ravel()將多維數(shù)組中的元素以一維數(shù)組的形式展開,該方法返回數(shù)組的視圖(view),如果修改,則會影響原始數(shù)組。numpy.ravel(a,order='C')數(shù)組操作importnumpyasnpa=np.arange(8).reshape(2,4)print('原數(shù)組:')print(a)print('調(diào)用ravel函數(shù)后:')print(a.ravel())print('F風格順序調(diào)用ravel函數(shù)之后:')print(a.ravel(order='F'))輸出結(jié)果如下:原數(shù)組:[[0123][4567]]調(diào)用ravel函數(shù)后:[01234567]F風格順序調(diào)用ravel函數(shù)之后:[04152637]數(shù)組轉(zhuǎn)置操作
數(shù)組操作numpy.transpose()numpy.transpose()用于對換多維數(shù)組的維度,比如二維數(shù)組使用此方法可以實現(xiàn)矩陣轉(zhuǎn)置,語法格式如下:numpy.transpose(arr,axes)參數(shù)說明如下:arr:要操作的數(shù)組axes:可選參數(shù),元組或者整數(shù)列表,將會按照該參數(shù)進行轉(zhuǎn)置。數(shù)組操作代碼如下:數(shù)組操作importnumpyasnpa=np.arange(12).reshape(3,4)print(a)print(np.transpose(a))輸出結(jié)果:原數(shù)組:[[0123][4567][891011]]對換數(shù)組:[[048][159][2610][3711]]1.10
實戰(zhàn):張量思維的養(yǎng)成——利用NumPy計算π
蒙特卡洛
計算π【范例1-3】利用循環(huán)思維求解π(loop-pi.py)
01import
math02import
random03from
time
importperf_counter05n=
1000
*
1000
*
1006hits=
007start=perf_counter()08for_in
range(n):09x=random.random()#產(chǎn)生一個0~1的隨機數(shù)x作為X軸坐標10y=random.random()#產(chǎn)生一個0~1的隨機數(shù)y作為Y軸坐標11ifmath.sqrt(x**
2
+y**
2)<
1:#判定(x,y)是否在1/4圓內(nèi)12hits+=
1
13pi=(hits/n)*
415now=perf_counter()16print('Pi={0:1.5f},time={1:1.5f}s'.format(pi,now-start))【運行結(jié)果】Pi=3.1421204,time=4.366808561004291s
利用NumPy中的張量思維求解π(tensor-pi.py)
01import
numpy
as
np02from
time
importperf_counter04n=
1000
*
1000
*
1005hits=
007start=perf_counter()08X,Y=np.random.rand(n),np.random.rand(n)09dist=np.sqrt(X**
2
+Y**
2)10pi=
4
*np.sum(dist<=
1)/n11now=perf_counter()13print(f'Pi={pi},time={now-start}s')【運行結(jié)果】Pi=3.1409008,time=0.3604922960003023s謝謝《數(shù)據(jù)分析與可視化》第2章NumPy數(shù)值計算進階2張量的堆疊操作與分割1NumPy數(shù)組的高級索引3NumPy張量的升維與降維4數(shù)據(jù)的去重與鋪疊5張量的排序6常用的統(tǒng)計方法2.1NumPy數(shù)組的高級索引花式”索引好用的布爾索引
2.1NumPy數(shù)組的高級索引In[1]:import
numpy
as
npIn[2]:normal_array=np.array([34,45,56,69,9,11,22,71,82,10,123])In[3]:normal_array#輸出驗證Out[3]:array([34,45,56,69,9,11,22,71,82,10,123])In[4]:fancy_index_array=normal_array[[0,8,7,7]]In[5]:fancy_index_arrayOut[5]:array([34,82,71,71])In[6]:index=[0,8,7,7] #這是一個裝滿索引的列表In[7]:normal_array[index] #將列表用作索引,這次可讀性強多了Out[7]:array([34,82,71,71])In[8]:two_dim_array=np.arange(20).reshape(4,5)#將a變形為一個4行5列的二維數(shù)組In[9]:two_dim_array #輸出驗證
Out[9]:array([[0,1,2,3,4],
[5,6,7,8,9],
[10,11,12,13,14],
[15,16,17,18,19]])In[10]:two_dim_array[[0,2,1,0]] #內(nèi)層方括號為花式索引Out[10]:array([[0,1,2,3,4], #第0行數(shù)據(jù)(以0為計數(shù)起點,下同)
[10,11,12,13,14], #第2行數(shù)據(jù)
[5,6,7,8,9], #第1行數(shù)據(jù)
[0,1,2,3,4]]) #第0行數(shù)據(jù)(重復(fù))In[11]:row_index=[0,2,1,0] #這是一個行索引坐標In[12]:two_dim_array[row_index] #花式訪問行數(shù)據(jù)Out[12]:array([[0,1,2,3,4],
[10,11,12,13,14],
[5,6,7,8,9],
[0,1,2,3,4]])2.1.2好用的布爾索引布爾數(shù)組索引
當輸出的結(jié)果需要經(jīng)過布爾運算(如比較運算)時,此時會使用到另一種高級索引方式,即布爾數(shù)組索引。索引In[6]:a=np.arange(10).reshape(2,5)In[7]:a#輸出驗證Out[7]:array([[0,1,2,3,4],[5,6,7,8,9]])In[8]:a[a>
5]Out[8]:array([6,7,8,9])布爾索引的應(yīng)用對比np.where1.np.where(condition,x,y)滿足條件(condition),輸出x,不滿足輸出y。>>>aa=np.arange(10)#非0即為真#array([0,1,2,3,4,5,6,7,8,9])>>>np.where(aa,1,-1)array([-1,1,1,1,1,1,1,1,1,1])#0為False,所以第一個輸出-1
>>>np.where(aa>5,1,-1)array([-1,-1,-1,-1,-1,-1,1,1,1,1])對比np.where2.np.where(condition)只有條件(condition),沒有x和y,則輸出滿足條件(即非0)元素的坐標(等價于numpy.nonzero)。這里的坐標以tuple的形式給出,通常原數(shù)組有多少維,輸出的tuple中就包含幾個數(shù)組,分別對應(yīng)符合條件元素的各維坐標。>>>a=np.array([2,4,6,8,10])>>>np.where(a>5)#返回的是數(shù)組的索引
(array([2,3,4]),)>>>a[np.where(a>5)]#等價于a[a>5]
array([6,8,10])對比numpy.clipnumpy.clip(a,a_min,a_max,out=None)其中a是一個數(shù)組,后面兩個參數(shù)分別表示最小和最大值
#設(shè)定返回的上下界,在上下界之內(nèi)的數(shù)據(jù)返回原來的值,小于下界值,則用下界值a_min代替原值。反之,大于下界值,則用上界值a_max代替原值。clip
夾子,別針;修剪;案例測試importnumpyasnptemperatures=[85.6,75.4,81.3,75.4,81.3]print(temperatures)print(np.clip(temperatures,78,82))原始數(shù)據(jù):
[85.6,75.4,81.3,75.4,81.3]截斷(上下界)數(shù)據(jù):[82.
78.
81.3
78.
81.3]對比神經(jīng)網(wǎng)絡(luò)中ReLU函數(shù)實現(xiàn):np.clipPyTorch用clamp測試:arr=np.array([-1,3,-2.1,-6,5,7])np.clip(arr,0,None)array([0.,3.,0.,0.,5.,7.])2.2張量的堆疊操作與分割連接與分割數(shù)組操作連接與分割數(shù)組是數(shù)組的兩種操作方式,現(xiàn)將它們的方法整合在一起。數(shù)組操作連接數(shù)組操作numpy.concatenate()沿指定軸連接相同形狀的兩個或多個數(shù)組,格式如下:numpy.concatenate((a1,a2,...),axis)參數(shù)說明:a1,a2,...:表示一系列相同類型的數(shù)組;axis:沿著該參數(shù)指定的軸連接數(shù)組,默認為0。數(shù)組操作2.2.1水平方向堆疊hstackIn[1]:arr1=np.zeros(shape=(2,2),dtype=np.int32)In[2]:arr1 #輸出驗證Out[2]:array([[0,0],[0,0]])In[3]:arr2=np.ones(shape=(2,3),dtype=np.int32)In[4]:arr2 #輸出驗證Out[4]:array([[1,1,1],[1,1,1]])In[5]:np.hstack((arr1,arr2))#內(nèi)部括號表示元組一個元組對象Out[5]:array([[0,0,1,1,1],[0,0,1,1,1]])垂直方向堆疊vstackIn[7]:arr2=np.ones(shape=(2,3),dtype=np.int32)In[8]:arr3=np.zeros(shape=(3,3),dtype=np.int32)In[9]:np.vstack((arr2,arr3))Out[9]:array([[1,1,1],[1,1,1],[0,0,0],[0,0,0]])垂直方向堆疊vstackIn[7]:arr2=np.ones(shape=(2,3),dtype=np.int)In[8]:arr3=np.zeros(shape=(3,3),dtype=np
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 工程建筑合同
- 房地產(chǎn)定向開發(fā)合同
- 杭州房屋買賣合同原件
- 食堂肉類采購合同
- 房屋居間委托合同
- 挖掘機產(chǎn)品銷售合同
- 辦公用品采購與供應(yīng)服務(wù)合同書
- 貨物運輸合同進口
- 1《我們愛整潔》( 教學設(shè)計)2023-2024學年統(tǒng)編版道德與法治一年級下冊
- 山西師范大學《家具設(shè)計與制作》2023-2024學年第二學期期末試卷
- 中央2025年公安部部分直屬事業(yè)單位招聘84人筆試歷年參考題庫附帶答案詳解
- 2024年公安部直屬事業(yè)單位招聘筆試真題
- 民政局2025年度離婚協(xié)議書官方模板4篇
- 上海市2024-2025學年高一上學期期末考試數(shù)學試題(含答案)
- 2024-2025學年五年級數(shù)學上冊名校真題 期末考試綜合檢測卷
- 2025年市青年企業(yè)家商會工作計劃
- DGTJ 08-2176-2024 瀝青路面預(yù)防養(yǎng)護技術(shù)標準(正式版含條文說明)
- 2023年湖南長沙自貿(mào)投資發(fā)展集團有限公司招聘筆試真題
- 《電子技能與實訓(xùn)》課件
- 基礎(chǔ)攝影培訓(xùn)
- 高一政治學科期末考試質(zhì)量分析報告(7篇)
評論
0/150
提交評論