一、前述
NumPy(Numerical Python的縮寫)是一個開源的Python科學計算庫。使用NumPy,就可以很自然地使用陣列和矩陣。 NumPy包含很多實用的數學函式,涵蓋線性代數運算、傅立葉變換和隨機數生成等功能。
這個庫的前身是1995年就開始開發的一個用於陣列運算的庫。經過了長時間的發展,基本上成了絕大部分Python科學計算的基礎包,當然也包括所有提供Python介面的深度學習框架。
二、具體應用
1、背景--為什麼使用Numpy?
a) 便捷:
對於同樣的數值計算任務,使用NumPy要比直接編寫Python程式碼便捷得多。這是因為NumPy能夠直接對陣列和矩陣進行操作,可以省略很多迴圈語句,其眾多的數學函式也會讓編寫程式碼的工作輕鬆許多。
b) 效能:
NumPy中陣列的儲存效率和輸入輸出效能均遠遠優於Python中等價的基本資料結構(如巢狀的list容器)。其能夠提升的效能是與陣列中元素的數目成比例的。對於大型陣列的運算,使用NumPy的確很有優勢。對於TB級的大檔案,NumPy使用記憶體對映檔案來處理,以達到最優的資料讀寫效能。
c) 高效:
NumPy的大部分程式碼都是用C語言寫成的,這使得NumPy比純Python程式碼高效得多。
當然,NumPy也有其不足之處,由於NumPy使用記憶體對映檔案以達到最優的資料讀寫效能,而記憶體的大小限制了其對TB級大檔案的處理;此外,NumPy陣列的通用性不及Python提供的list容器。因此,在科學計算之外的領域,NumPy的優勢也就不那麼明顯。
2、Numpy的安裝
(1) 官網安裝。http://www.numpy.org/。
(2) pip 安裝。pip install numpy。
(3) LFD安裝,針對windows使用者http://www.lfd.uci.edu/~gohlke/pythonlibs/。
(4) Anaconda安裝(推薦),Anaconda裡面整合了很多關於python科學計算的第三方庫,主要是安裝方便。下載地址:https://www.anaconda.com/download/。
3、numpy 基礎:
NumPy的主要物件是同種元素的多維陣列。這是一個所有的元素都是一種型別。
在NumPy中維度(dimensions)叫做軸(axes),軸的個數叫做秩(rank)。
NumPy的陣列類被稱作 ndarray 。通常被稱作陣列。
常用的ndarray物件屬性有:
ndarray.ndim(陣列軸的個數,軸的個數被稱作秩),
ndarray.shape(陣列的維度。這是一個指示陣列在每個維度上大小的整數元組。例如一個n行m列的矩陣,它的shape屬性將是(2,3),這個元組的長度顯然是秩,即維度或者ndim屬性),
ndarray.size(陣列元素的總個數,等於shape屬性中元組元素的乘積)
ndarray.dtype(一個用來描述陣列中元素型別的物件,可以通過創造或指定dtype使用標準Python型別。另外NumPy提供它自己的資料型別)。
4、Numpy的資料型別:
三、具體案例
程式碼一:基本型別標識
import numpy as np a = np.dtype(np.int_) # np.int64, np.float32 … print(a)
int8, int16, int32,int64 可以由字串’i1’, ‘i2’,’i4’, ‘i8’代替,其餘的以此類推。
import numpy as np a = np.dtype('i8') # ’f8’, ‘i4’’c16’,’a30’(30個字元的字串), ‘>i4’… print (a)
可以指明資料型別在記憶體中的位元組序,’>’表示按大端的方式儲存,’<’表示按小端的方式儲存,’=’表示資料按硬體預設方式儲存。大端或小端儲存隻影響資料在底層記憶體中儲存時位元組的儲存順序,在我們實際使用python進行科學計算時,一般不需要考慮該儲存順序。
程式碼二:建立陣列並檢視其屬性
import numpy as np a = np.array([[1,2,3], [4, 5, 6]], dtype=int) print(a.shape) # a.ndim, a.size, a.dtype
import numpy as np a = np.array([(1,2,3), (4, 5, 6)], dtype=float) print(a.shape) # a.ndim, a.size, a.dtype
用np.arange().reshape()建立陣列:
import numpy as np a = np.arange(10).reshape(2, 5) # 建立2行5列的二維陣列, # 也可以建立三維陣列, b = np.arange(12).reshape(2,3,2) print(a) print(b)
a = np.array([[[1,2,3], [4, 5, 6], [7, 8, 9]]]) b = np.array([[[1,2,3]], [[4, 5, 6]], [[7, 8, 9]]]) print(a.shape) print(b.shape)
程式碼三:基本運算
import numpy as np a = np.random.random(6) b = np.random.rand(6) c = np.random.randn(6) print(a-b) # print(a+b),print(a*c) …
print(np.dot(a,b)) #複習矩陣乘法
# Numpy 隨機數模組np.random.random, np.random.randn, np.random.rand的比較
(1)rand 生成均勻分佈的偽隨機數。分佈在(0~1)之間
(2)randn 生成標準正態分佈的偽隨機數(均值為0,方差為1)。
import numpy as np a = np.ones((2,3)) b = np.zeros((2,3)) a*=3 b+=a print(a) print(b)
程式碼四:常用函式
程式碼五:索引,切片和迭代
import numpy as np a = np.arange(10)**3 print(a) print(a[2:5]) a[:6:2] = -1000 print(a) print(a[ : :-1])
[x:y:z]切片索引,x是左端,y是右端,z是步長,在[x,y)區間從左到右每隔z取值,預設z為1可以省略z引數.
步長的負號就是反向,從右到左取值.
二維陣列:
b = np.arange(20).reshape(5,4) print(b) print(b[2,3]) print(b[0:5, 1]) print(b[ : ,1]) print(b[1:3, : ])
#當少於軸數的索引被提供時,丟失的索引被認為是整個切片
b[-1] #相當於b[-1,:] 最後一行
# b[i] 中括號中的表示式被當作 i 和一系列 : ,來代表剩下的軸。NumPy也允許你使用“點”像 b[i,...] 。
#點 (…)代表許多產生一個完整的索引元組必要的分號。如果x是
#秩為5的陣列(即它有5個軸),那麼:
x[1,2,…] 等同於 x[1,2,:,:,:],
x[…,3] 等同於 x[:,:,:,:,3],
x[4,…,5,:] 等同 x[4,:,:,5,:].
三維陣列:
c = np.arange(12).reshape(2,3,2) print(c) c[1] c[2,1] # 等價於c[2][1] c[2,1,1] # 等價於c[2][1][1]
通過布林陣列索引
f = np.arange(12).reshape(3, 4) print(f) g = f>4 print(g) print(f [g])
通過迭代取值
h = np.arange(12).reshape(3,4) print(h) for i in h: print(i) for i in h.flat: print(i)
迭代多維陣列是就第一個軸而言的:
如果想對每個陣列中元素進行運算,我們可以使用flat屬性,該屬性是陣列元素的一個迭代器:
np.flatten()返回一個摺疊成一維的陣列。但是該函式只能適用於numpy物件,即array或者mat,普通的list列表是不行的。
a = np.array([[1,2], [3, 4], [5, 6]]) print(a.flatten())
程式碼六:形狀操作
ravel(), vstack(),hstack(),column_stack,row_stack, stack, split, hsplit, vsplit
import numpy as np #增加維度 a = np.arange(5) print(a[:, np.newaxis]) print(a[np.newaxis, :]) print(np.tile([1,2], 2))
a = np.arange(10).reshape(2,5) print(a) print(a.ravel()) print(a.resize(5,2)) b = np.arange(6).reshape(2,3) c = np.ones((2,3)) d = np.hstack((b,c)) print(b) print(c) print(d)# hstack:horizontal stack 左右合併
e = np.vstack((b,c)) print(e)# vstack: vertical stack 上下合併 f = np.column_stack((b,c)) g = np.row_stack((b,c)) h = np.stack((b, c), axis=1) # 按行合併 i = np.stack((b,c), axis=0) # 按列合併 j = np.concatenate ((b, c, c, b), axis=0) #多個合併