NumPy是Python的一個(gè)擴(kuò)展庫(kù),負(fù)責(zé)數(shù)組和矩陣運(yùn)行,。相較于傳統(tǒng)Python,,NumPy運(yùn)行效率高,,速度快,,是利用Python處理數(shù)據(jù)必不可少的工具,。 這個(gè)NumPy快速入門系列分為四篇,,包含了NumPy大部分基礎(chǔ)知識(shí),,每篇閱讀時(shí)間不長(zhǎng),但內(nèi)容含量高,。大家最好親自碼一遍代碼,,這樣可以更有收獲。 概要 輕松認(rèn)識(shí)和安裝NumPy,,對(duì)NumPy建立一個(gè)良好印象,。 掌握NumPy的各種屬性,讓使用數(shù)組變得得心應(yīng)手,。 學(xué)會(huì)三種創(chuàng)建數(shù)組方法,,讓創(chuàng)建數(shù)組變得輕而易舉。 NumPy安裝和介紹 NumPy安裝 我們提供兩種命令安裝方法,,都非常簡(jiǎn)便:
這兩種安裝方法適用于Windows, Linux,以及Mac系統(tǒng),。 (1)pip命令:pip install numpy 當(dāng)終端顯示成功安裝或者已經(jīng)安裝說(shuō)明numpy已經(jīng)安裝完畢。 (2)conda命令:conda install numpy conda命令是通過(guò)Anaconda軟件來(lái)安裝NumPy,。安裝好Anaconda軟件后,,打開(kāi)Anaconda Prompt后在里面輸入conda install numpy命令即可。 安裝完成后,,為了檢驗(yàn)NumPy是否可以使用,,我們用一個(gè)簡(jiǎn)單的例子做個(gè)實(shí)驗(yàn): 代碼: import numpy as npprint (np.eye(4)) 講解: 為了方便,大家一般采用import numpy as np這種調(diào)用方法,,將numpy縮寫成np來(lái)使用,。我們使用NumPy中的eye()函數(shù)來(lái)檢查NumPy是否已經(jīng)安裝完成,eye(N)是一個(gè)產(chǎn)生N*N的單位矩陣 運(yùn)行結(jié)果: [[1. 0. 0. 0.] [0. 1. 0. 0.] [0. 0. 1. 0.] [0. 0. 0. 1.]] 如果大家的屏幕里面也出現(xiàn)了這個(gè)結(jié)果,,那么恭喜你NumPy庫(kù)已經(jīng)成功安裝,,可以開(kāi)始正式學(xué)習(xí)了。 NumPy和列表 我們首先要搞清楚的是,,NumPy處理的對(duì)象是什么,。事實(shí)上,我們把NumPy處理的對(duì)象叫ndarray,這是一個(gè)縮寫,,翻譯過(guò)來(lái)叫做多維數(shù)組,。ndarray類型的數(shù)據(jù)和我們之前學(xué)過(guò)的列表頗有淵源: 代碼: import numpy as nplist = [1, 2, 3]arr = np.array(list)print (type(list))print (type(arr)) 講解: 我們首先建立一個(gè)列表,然后通過(guò)np.array函數(shù)將這個(gè)列表轉(zhuǎn)換成一個(gè)NumPy數(shù)組,,通過(guò)打印這兩個(gè)變量的type信息,,我們可以發(fā)現(xiàn)二者的區(qū)別和聯(lián)系。 運(yùn)行結(jié)果: <class 'list'><class 'numpy.ndarray'> 沒(méi)錯(cuò),,arr變量的數(shù)據(jù)類型是ndarray,。當(dāng)然,我們并不是總是通過(guò)轉(zhuǎn)換列表變成ndarray,。我們想強(qiáng)調(diào)的是,,雖然NumPy數(shù)組雖然和列表很類似,但是二者卻是完全不同的數(shù)據(jù)類型,,因此二者使用方法也有很大不同,。 Numpy比Python列表更具優(yōu)勢(shì),其中一個(gè)優(yōu)勢(shì)便是速度,。在對(duì)大型數(shù)組執(zhí)行操作時(shí),,Numpy的速度比Python列表的速度快了好幾百。因?yàn)镹umpy數(shù)組本身能節(jié)省內(nèi)存,,并且Numpy在執(zhí)行算術(shù),、統(tǒng)計(jì)和線性代數(shù)運(yùn)算時(shí)采用了優(yōu)化算法。 常見(jiàn)數(shù)組 我們最后給大家介紹常見(jiàn)的幾種ndarray數(shù)組: 代碼: a = np.array([1, 2, 3])b = np.array([[1, 2], [3, 4]])c = np.array([1, 2, 3], dtype = complex)print (a)print (b)print (c) 講解: a是一個(gè)一維數(shù)組,;b是一個(gè)二維數(shù)組,;c是復(fù)數(shù)變量的一維數(shù)組。這些都是常見(jiàn)的ndarray,,以后我們將會(huì)用NumPy提供的函數(shù)對(duì)這些常見(jiàn)的數(shù)組進(jìn)行處理,,來(lái)完成我們想要的目標(biāo)。 運(yùn)行結(jié)果: [1 2 3][[1 2] [3 4]][1.+0.j 2.+0.j 3.+0.j] NumPy數(shù)組屬性 我們將幾種常見(jiàn)數(shù)組屬性分成以下幾種:
NumPy支持很多不同的數(shù)據(jù)類型,,從整數(shù)型(int)到浮點(diǎn)型(float),,再到復(fù)數(shù)型,應(yīng)有盡有,。如何判斷數(shù)組的數(shù)據(jù)類型是一件比較重要的事情,,NumPy給我們提供了dtype命令來(lái)查看數(shù)據(jù)類型: 代碼: import numpy as npa = np.array([1, 2, 3])b = np.array([[1.1, 2], [3.1, 4.2]])c = np.array([1, 2, 3], dtype = complex)print (a.dtype, b.dtype, c.dtype) 講解: 我們分別建立了三個(gè)NumPy數(shù)組,a是整數(shù)型,;b是浮點(diǎn)型,;c是復(fù)數(shù)型。dtype既可以在創(chuàng)建數(shù)組的時(shí)候申明變量類型,,也可以通過(guò)打印告訴我們數(shù)組的數(shù)據(jù)類型,。 運(yùn)行結(jié)果: int32 float64 complex128 在我們知道了NumPy數(shù)據(jù)類型后,,我們還需要知道它的更多屬性來(lái)全面了解這個(gè)數(shù)組。 代碼: b = np.array([[1.1, 2], [3.1, 4.2]])c = np.array([1, 2, 3], dtype = complex)print (b.ndim, b.shape, b.size)print (c.real, c.imag) 講解: 我們分別查看了b數(shù)組的維度,,形狀,,以及元素個(gè)數(shù)。我們知道b是一個(gè)2*2的浮點(diǎn)型數(shù)組,,因?yàn)樗木S度是2,形狀就是行數(shù)乘以列數(shù)(2,2),;元素個(gè)數(shù)是4。對(duì)于c這個(gè)復(fù)數(shù)數(shù)組,,我們調(diào)用了實(shí)部(real)和虛部(imag)這個(gè)兩個(gè)屬性。 運(yùn)行結(jié)果: 2 (2, 2) 4[1. 2. 3.] [0. 0. 0.] 創(chuàng)建數(shù)組 對(duì)于NumPy數(shù)組,,一般而言我們有三種創(chuàng)建方法:
我們先介紹第二種方法中常見(jiàn)的幾種函數(shù):
np.zeros() & np.ones() 代碼: e = np.array([1, 2, 3], dtype=float)f = np.zeros((3,2),dtype=int)g = np.ones((1,3))print (e)print (f)print (g) 講解: 我們用第一種方法,,創(chuàng)建了數(shù)據(jù)類型為浮點(diǎn)型(float)的數(shù)組e;然后通過(guò)第二種方法,,分別創(chuàng)建了元素都是0和1的兩個(gè)數(shù)組。注意到我們可以通過(guò)dtype,,以及shape等來(lái)控制數(shù)組屬性,。在上面的例子中f和g,我們把shape省略了,只用(3,2)這種形式,。 運(yùn)行結(jié)果: [1. 2. 3.][[0 0] [0 0] [0 0]][[1. 1. 1.]] np.arrange() 很多情況下我們非常想要得到從一個(gè)整數(shù)到另一個(gè)整數(shù)的一個(gè)數(shù)組,,比如周一到周日,一天中從1點(diǎn)到24點(diǎn)等,,還有從-10度到40度的溫度范圍,。這時(shí)候用NumPy中的arange函數(shù)就可以幫助你達(dá)成這個(gè)目標(biāo)。 arange函數(shù)有四個(gè)輸入?yún)?shù)來(lái)調(diào)整:
值得注意的是,,這里的終止值是取不到的,所以真正意義上而言終止值是stop-1,。 代碼: import numpy as npa = np.arange(5)b = np.arange(1,5)c = np.arange(1,10,2)d = np.arange(2,6,dtype=float)print (a, b, c, d) 講解: 我們一共建立了四個(gè)數(shù)組,,第一個(gè)我們只有一個(gè)參數(shù),是終止值參數(shù),,這時(shí)候其他參數(shù)都是默認(rèn)的,。第二個(gè)數(shù)組,我們給定了起始值和終止值,。第三個(gè)數(shù)組我們?cè)黾恿瞬介L(zhǎng),。第四個(gè)數(shù)組,我們隱藏的其實(shí)是步長(zhǎng),也就是取默認(rèn)值1,。大家在看答案之前可以猜一下a,b,c,d分別是多少,。 運(yùn)行結(jié)果: [0 1 2 3 4] [1 2 3 4] [1 3 5 7 9] [2. 3. 4. 5.] np.linspace() linspace是linear space的縮寫,線性空間,。和arange稍有不同的是,,linspace沒(méi)有步長(zhǎng),相反它有個(gè)叫做num的參數(shù)來(lái)控制生成數(shù)列的總數(shù)目,。也就是說(shuō),,在給定起始值和終止值的時(shí)候,步長(zhǎng)被總數(shù)目決定了,。 代碼: a = np.linspace(1,10,10)b = np.linspace(10,20,5, endpoint = False)c = np.linspace(10,20,5, endpoint = False, retstep = True)print (a)print (b)print (c) 講解: 我們分別利用linspace建立了三個(gè)數(shù)組,,第一個(gè)endpoint不賦值,默認(rèn)是True,,默認(rèn)終止值是包含在內(nèi)的,;第二個(gè)我們不把終止值包括在內(nèi);最后我們用retstep=True顯示數(shù)列的間距,。 運(yùn)行結(jié)果: [ 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.][10. 12. 14. 16. 18.](array([10., 12., 14., 16., 18.]), 2.0) 第三種創(chuàng)建方法:asarray() & array() asarray函數(shù)可以將其他數(shù)據(jù)類型轉(zhuǎn)換成Numpy數(shù)組,。 代碼: a = [1, 2, 3]b = (1, 2, 3)a_1 = np.array(a)a_2 = np.asarray(a)b_1 = np.array(b)b_2 = np.asarray(b)print (a_1, a_2,type(a_1))print (b_1, b_2) 講解: 我們建立了一個(gè)列表a和一個(gè)元組b,分別用np.array和np.asarray來(lái)轉(zhuǎn)換,。其實(shí)在將列表和元組轉(zhuǎn)換成numpy數(shù)組的時(shí)候效果是一樣的,。也就是說(shuō)不論是從列表a出發(fā)得到的a_1和a_2還是從元組b出發(fā)得到的b_1和b_2都是numpy數(shù)組[1,2,3]。 但是,,他們二者還是有區(qū)別的,,當(dāng)數(shù)據(jù)源是ndarray,即numpy數(shù)組的時(shí)候,array會(huì)復(fù)制出一個(gè)副本,,占用新的內(nèi)存,,但是asarray并不會(huì)。從這里看來(lái),,對(duì)一般的程序任務(wù),,我們并不太需要區(qū)分array和asarray,除非做大型數(shù)據(jù)的時(shí)候 運(yùn)行結(jié)果: [1 2 3] [1 2 3][1 2 3] [1 2 3] |
|