NumPy 1.14 教學 – #01 基礎, 建立陣列的方法
開始學NumPy之前至少先熟悉Python基礎使用方法,這樣再來看NumPy才不會那麼吃力!
Python3 教學、筆記本文將介紹NumPy的陣列和Python的陣列不同之處、以及建立陣列或矩陣的方法以及基本操作。
本內容的的練習範例同步放置於GitHub:Learn NumPy – GitHub
各位可以直接去下載來玩看看,體會與Python之間的差異能加速了解NumPy的操作!
NumPy中的陣列和Python內建的陣列有什麼不同呢?
NumPy的array是NumPy中名為ndarray的Class所定義的,而這個array當然支援多維度陣列,也可以說它是一個支援矩陣(Martix)的類別!然而,Python的array則是標準函式庫內建的類別,叫做array.array。而Python的array能支援單維度(1維)的陣列,而且提供的功能選項也比NumPy來得少!
匯入(import) NumPy
1 |
import numpy as np |
建立一個陣列,並給予一些初始值!
這邊分別以兩種型別(整數、浮點數)的數值來做範例,整數、浮點數分別為a和b。
ndarray.dtype:該陣列型別的屬性
1 2 3 4 5 6 |
a = np.array([1, 2, 3, 4, 5]) print("a=>{0}".format(a)) print("b.dtype=>{0}".format(a.dtype)) print() b = np.array([1.25, 2.25, 3.25, 4.25, 5.25]) print("b.dtype=>{0}".format(b.dtype)) |
1 2 3 4 |
a=>[1 2 3 4 5] b.dtype=>int64 b.dtype=>float64 |
重要屬性
ndarray.ndim:NumPy ndarray物件的維度
ndarry.shape:ndarry物件的每一個維度的大小(size),回傳資料類別為Tuple
ndarry.size:ndarry物件所組成之array的總元素數量,回應之數值會等於ndarray.shape的每個元素相乘
ndarry.dtype:ndarray物件內組成元素的型態
ndarray.itemsize:陣列中每一個元素的大小(Bytes) (ex: int16=>16/8=2 Bytes)
ndarry.data:這是一個存有實際陣列元素的緩衝,通常我們不需要使用這個屬性,因為我們可以使用index存取這些元素。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
aa = np.array([(1.9, 1.5, 1.3), (2.9, 2.5, 2.3)], dtype=np.int16) # ndarray.ndim print("ndim:{0}".format(aa.ndim)) # ndarry.shape print("shape:{0}".format(aa.shape)) # ndarry.size print("size:{0}".format(aa.size)) # ndarry.dtype print("dtype:{0}".format(aa.dtype)) # ndarray.itemsize print("itemsize:{0}".format(aa.itemsize)) # ndarry.data print("data:{0}".format(aa.data)) |
1 2 3 4 5 6 |
ndim:2 shape:(2, 3) size:6 dtype:int16 itemsize:2 data:<memory at 0x7f5844b44a68> |
1維陣列
np.array( [<陣列元素用逗號隔開>] ):簡易一維陣列
np.arange( 起始值, 結束值, 步幅, 資料型別 ):也是產生一維陣列,和np.array()的差別在於arange擁有較大的彈性,而且元素數值是自動化產生!
1 2 3 4 5 6 7 8 9 |
## 1維陣列 a = np.array([6, 5, 4, 3, 2]) print("a=>{0}".format(a)) print() b = np.arange(10) print("b=>{0}".format(b)) print() c = np.arange(0, 10, 1.5, dtype=np.float64) print("c=>{0}".format(c)) |
1 2 3 4 5 |
a=>[6 5 4 3 2] b=>[0 1 2 3 4 5 6 7 8 9] c=>[0. 1.5 3. 4.5 6. 7.5 9. ] |
2維陣列
np.array( [[<Row1陣列元素>], [<Row2陣列元素>]] ):產生簡易二維陣列
1 2 3 |
## 2維陣列 2-by-3 array b = np.array([[1.1, 1.2, 1.3], [2.1, 2.2, 2.3]]) print("b=>{0}".format(b)) |
1 2 |
b=>[[1.1 1.2 1.3] [2.1 2.2 2.3]] |
指定陣列型別
np.array( [[<Row1陣列元素>], [<Row2陣列元素>]], dtype=np.int16 ):產生型別為int的陣列
1 2 3 |
## Assign a particular data type to an array aa = np.array([[1.9, 1.5, 1.3], [2.9, 2.5, 2.3]], dtype=np.int16) print("aa=>{0}".format(aa)) |
1 2 |
aa=>[[1 1 1] [2 2 2]] |
複數陣列(Complex)
很簡單,就是把陣列元素用複數表示法指定就好了:實部+虛部j
或者是用dtype=complex指定陣列元素為複數!
1 2 3 4 5 |
c1 = np.array([(1.1, 1.2, 1.3), (2.1, 2.2, 2.3)], dtype=complex) print("c1=>{0}".format(c1)) print() c2 = np.array([2.1+6j, 3.2+9j, 4.3+12j]) print("c2=>{0}".format(c2)) |
1 2 3 4 |
c1=>[[1.1+0.j 1.2+0.j 1.3+0.j] [2.1+0.j 2.2+0.j 2.3+0.j]] c2=>[2.1 +6.j 3.2 +9.j 4.3+12.j] |
Zeros
np.zeros( (陣列各維度大小用逗號區分) ):建立全為0的陣列,可以小括號定義陣列的各個維度的大小!
1 2 |
zeros = np.zeros( (3, 5) ) print("zeros=>{0}".format(zeros)) |
1 2 3 |
zeros=>[[0. 0. 0. 0. 0.] [0. 0. 0. 0. 0.] [0. 0. 0. 0. 0.]] |
Ones
np.ones( (陣列各維度大小用逗號區分) ):用法與np.zeros一樣!
1 2 3 |
## Ones ones = np.ones( (3, 5) ) print("ones=>{0}".format(ones)) |
1 2 3 |
ones=>[[1. 1. 1. 1. 1.] [1. 1. 1. 1. 1.] [1. 1. 1. 1. 1.]] |
Empty
np.empty( (陣列各維度大小用逗號區分) ):用法與np.zeros一樣,但唯一的差別是NumPy不會初始化陣列內元素的初始值,所以內容將會是不確定的。
1 2 3 4 |
## Empty ## It means that we want to declare a uninitialized matrix. e = np.empty( (2, 5) ) print("e=>{0}".format(e)) |
1 2 |
e=>[[25. 25.5 26. 26.5 27. ] [27.5 28. 28.5 29. 29.5]] |
Arange
np.arange( 起始值, 結束值, 步幅, 資料型別 ):也是產生一維陣列,和np.array()的差別在於arange擁有較大的彈性,而且元素數值是自動化產生!步幅決定每隔多少數值產生一個元素(等差的概念)。
1 2 3 |
## Arange r1 = np.arange(25, 30, .5) print("r1=>{0}".format(r1)) |
1 |
r1=>[25. 25.5 26. 26.5 27. 27.5 28. 28.5 29. 29.5] |
Linspace
np.linspace( 起始值, 結束值, 起始與結束的區間內要產生幾個元素 ):這個在畫線時還蠻常用到的!只要給定陣列的區間(起始值、結束值),就可以要求在這個區間內產生幾個元素!
1 2 3 |
## Linspace lin = np.linspace(3, 5, 9) print("lin=>\n{0}".format(lin)) |
1 2 |
lin=> [3. 3.25 3.5 3.75 4. 4.25 4.5 4.75 5. ] |