Python進階之NumPy快速入門(一)
- 2019 年 10 月 11 日
- 筆記
前言
NumPy是Python的一個擴展庫,負責數組和矩陣運行。相較於傳統Python,NumPy運行效率高,速度快,是利用Python處理數據必不可少的工具。
這個NumPy快速入門系列分為四篇,包含了NumPy大部分基礎知識,每篇閱讀時間不長,但內容含量高。大家最好親自碼一遍程式碼,這樣可以更有收穫。
概要
輕鬆認識和安裝NumPy,對NumPy建立一個良好印象。
掌握NumPy的各種屬性,讓使用數組變得得心應手。
學會三種創建數組方法,讓創建數組變得輕而易舉。
01
NumPy安裝和介紹
NumPy安裝
我們提供兩種命令安裝方法,都非常簡便:
- pip命令安裝
- conda命令安裝
這兩種安裝方法適用於Windows, Linux,以及Mac系統。
(1)pip命令:pip install numpy
當終端顯示成功安裝或者已經安裝說明numpy已經安裝完畢。
(2)conda命令: conda install numpy
conda命令是通過Anaconda軟體來安裝NumPy。安裝好Anaconda軟體後,打開Anaconda Prompt後在裡面輸入conda install numpy命令即可。
安裝完成後,為了檢驗NumPy是否可以使用,我們用一個簡單的例子做個實驗:
程式碼:
import numpy as np print (np.eye(4))
講解:
為了方便,大家一般採用import numpy as np這種調用方法,將numpy縮寫成np來使用。我們使用NumPy中的eye()函數來檢查NumPy是否已經安裝完成,eye(N)是一個產生N*N的單位矩陣
運行結果:
[[1. 0. 0. 0.]
[0. 1. 0. 0.]
[0. 0. 1. 0.]
[0. 0. 0. 1.]]
如果大家的螢幕裡面也出現了這個結果,那麼恭喜你NumPy庫已經成功安裝,可以開始正式學習了。
NumPy和列表
我們首先要搞清楚的是,NumPy處理的對象是什麼。事實上,我們把NumPy處理的對象叫ndarray,這是一個縮寫,翻譯過來叫做多維數組。ndarray類型的數據和我們之前學過的列表頗有淵源:
程式碼:
import numpy as np list = [1, 2, 3] arr = np.array(list) print (type(list)) print (type(arr))
講解:
我們首先建立一個列表,然後通過np.array函數將這個列錶轉換成一個NumPy數組,通過列印這兩個變數的type資訊,我們可以發現二者的區別和聯繫。
運行結果:
<class 'list'>
<class 'numpy.ndarray'>
沒錯,arr變數的數據類型是ndarray。當然,我們並不是總是通過轉換列表變成ndarray。我們想強調的是,雖然NumPy數組雖然和列表很類似,但是二者卻是完全不同的數據類型,因此二者使用方法也有很大不同。
Numpy比Python列表更具優勢,其中一個優勢便是速度。在對大型數組執行操作時,Numpy的速度比Python列表的速度快了好幾百。因為Numpy數組本身能節省記憶體,並且Numpy在執行算術、統計和線性代數運算時採用了優化演算法。
常見數組
我們最後給大家介紹常見的幾種ndarray數組:
程式碼:
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是一個一維數組;b是一個二維數組;c是複數變數的一維數組。這些都是常見的ndarray,以後我們將會用NumPy提供的函數對這些常見的數組進行處理,來完成我們想要的目標。
運行結果:
[1 2 3]
[[1 2]
[3 4]]
[1.+0.j 2.+0.j 3.+0.j]
02
NumPy數組屬性
我們將幾種常見數組屬性分成以下幾種:
- 數據類型 dtype
- 元素個數 size
- 維度 ndim
- 形狀 shape
- 實部和虛部 real image
NumPy支援很多不同的數據類型,從整數型(int)到浮點型(float),再到複數型,應有盡有。如何判斷數組的數據類型是一件比較重要的事情,NumPy給我們提供了dtype命令來查看數據類型:
程式碼:
import numpy as np a = 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)
講解:
我們分別建立了三個NumPy數組,a是整數型;b是浮點型;c是複數型。dtype既可以在創建數組的時候申明變數類型,也可以通過列印告訴我們數組的數據類型。
運行結果:
int32 float64 complex128
在我們知道了NumPy數據類型後,我們還需要知道它的更多屬性來全面了解這個數組。
程式碼:
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數組的維度,形狀,以及元素個數。我們知道b是一個2*2的浮點型數組,因為它的維度是2,形狀就是行數乘以列數(2,2);元素個數是4。對於c這個複數數組,我們調用了實部(real)和虛部(imag)這個兩個屬性。
運行結果:
2 (2, 2) 4
[1. 2. 3.] [0. 0. 0.]
03
創建數組
對於NumPy數組,一般而言我們有三種創建方法:
- 用np.array直接填入已知數據,比如我們在第一小節介紹常見數組的時候用的方法。
- 用特殊函數創建符合一定規律的數組。比如numpy.zeros:創建元素全是0的數組。
- 用asarray將其他類型數據轉換成NumPy數組。
我們先介紹第二種方法中常見的幾種函數:
- numpy.zeros 創建元素全是0的數組
- numpy.ones 創建元素全是1的數組
- numpy.arrange 創建數值範圍
- numpy.linspace 創建數值範圍
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)
講解:
我們用第一種方法,創建了數據類型為浮點型(float)的數組e;然後通過第二種方法,分別創建了元素都是0和1的兩個數組。注意到我們可以通過dtype,以及shape等來控制數組屬性。在上面的例子中f和g,我們把shape省略了,只用(3,2)這種形式。
運行結果:
[1. 2. 3.]
[[0 0]
[0 0]
[0 0]]
[[1. 1. 1.]]
np.arrange()
很多情況下我們非常想要得到從一個整數到另一個整數的一個數組,比如周一到周日,一天中從1點到24點等,還有從-10度到40度的溫度範圍。這時候用NumPy中的arange函數就可以幫助你達成這個目標。
arange函數有四個輸入參數來調整:
- start 起始值
- stop 終止值
- step 步長(默認是1)
- dtype 數據類型。
值得注意的是,這裡的終止值是取不到的,所以真正意義上而言終止值是stop-1。
程式碼:
import numpy as np a = 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)
講解:
我們一共建立了四個數組,第一個我們只有一個參數,是終止值參數,這時候其他參數都是默認的。第二個數組,我們給定了起始值和終止值。第三個數組我們增加了步長。第四個數組,我們隱藏的其實是步長,也就是取默認值1。大家在看答案之前可以猜一下a,b,c,d分別是多少。
運行結果:
[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沒有步長,相反它有個叫做num的參數來控制生成數列的總數目。也就是說,在給定起始值和終止值的時候,步長被總數目決定了。
程式碼:
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建立了三個數組,第一個endpoint不賦值,默認是True,默認終止值是包含在內的;第二個我們不把終止值包括在內;最後我們用retstep=True顯示數列的間距。
運行結果:
[ 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.]
[10. 12. 14. 16. 18.]
(array([10., 12., 14., 16., 18.]), 2.0)
第三種創建方法:asarray() & array()
asarray函數可以將其他數據類型轉換成Numpy數組。
程式碼:
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)
講解:
我們建立了一個列表a和一個元組b,分別用np.array和np.asarray來轉換。其實在將列表和元組轉換成numpy數組的時候效果是一樣的。也就是說不論是從列表a出發得到的a_1和a_2還是從元組b出發得到的b_1和b_2都是numpy數組[1,2,3]。
但是,他們二者還是有區別的,當數據源是ndarray,即numpy數組的時候,array會複製出一個副本,佔用新的記憶體,但是asarray並不會。從這裡看來,對一般的程式任務,我們並不太需要區分array和asarray,除非做大型數據的時候
運行結果:
[1 2 3] [1 2 3]
[1 2 3] [1 2 3]
總結回顧
1
兩種方法安裝NumPy,NumPy和列表的區別和聯繫。
2
NumPy數組的幾種屬性,包括數據類型,維度,大小等。
3
三種創建數組的方法,直接創建,特殊函數,數組轉換。