NumPy 1.14 教學 – #04 索引(Indexing)、切片(Slicing)、迭代(Iterating)、From Function
開始學NumPy之前至少先熟悉Python基礎使用方法,這樣再來看NumPy才不會那麼吃力!
Python3 教學、筆記本篇將介紹如何使用NumPy對於陣列依據索引值(Indexing)存取資料、切片(Slicing)以及使用迴圈對1維矩陣、多維矩陣迭代取值等方法。最特別的是,本篇會介紹From Function的使用方法以及其用途!
本文章範例也同步存放在:Learn NumPy – GitHub
索引(Indexing)的用途不外乎就是為了要從陣列和矩陣中取值,但除此之外有很多種功能!
可以取出連續區間,還可以間隔取值!
選取連續區間 [a:b]
選取索引值a到b的資料x[a:b]
a:選取資料的起始索引,不指定表示從頭開始
b:選取資料的結束索引+1,不指定表示直到陣列結束
| 1 2 3 4 | a = np.arange(10) ** 2 print("a=> {0}".format(a)) print() print("a[2:5]=> {0}".format(a[2:5])) | 
| 1 2 3 | a=> [ 0  1  4  9 16 25 36 49 64 81] a[2:5]=> [ 4  9 16] | 
切片(Slicing)的用途和索引(Indexing)很像!
若能活用便能加快程式撰寫速度!
間隔選取[::c]
以1維陣列來說明x[a:b:c]
a:選取資料的起始索引
b:選取資料的結束索引+1
c:選取資料間隔,以索引值可以被此值整除的元素,不指定表示1
從index為3起算,每數到4的元素值都改為9999,直到第8個元素(index為7)為止
| 1 2 3 | a = np.arange(10) ** 2 a[3:8:4] = 9999 print("a[3:8:4]=> {0}".format(a)) | 
| 1 | a[3:8:4]=> [   0    1    4 9999   16   25   36 9999   64   81] | 
倒序[::-1]
只是單純的把順序反過來,並無數值大小比較
| 1 2 | a = np.arange(10) ** 2 print("a[:,:,-1])=> {0}".format(a[::-1])) | 
| 1 | a[:,:,-1])=> [81 64 49 36 25 16  9  4  1  0] | 
迭代(Iterating)比較熟悉一點,可以說就像foreach一樣的使用方法
| 1 2 3 4 | # Iteracted over a = np.arange(10) ** 2 for i in a:     print("a**(1/2)=> {0}".format(np.round(i**(1/2), 0))) | 
| 1 2 3 4 5 6 7 8 9 10 | a**(1/2)=> 0.0 a**(1/2)=> 1.0 a**(1/2)=> 2.0 a**(1/2)=> 3.0 a**(1/2)=> 4.0 a**(1/2)=> 5.0 a**(1/2)=> 6.0 a**(1/2)=> 7.0 a**(1/2)=> 8.0 a**(1/2)=> 9.0 | 
多維陣列在for loop中取值時,會以第一維度為優先!
以二維陣列為例:一層for loop優先獲取的陣列內容,就是第一維度每row的內容!
| 1 2 3 4 5 6 | b = np.arange(1, 41).reshape(5, 8) print() # for loop for row in b:     print(row) | 
| 1 2 3 4 5 | [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 30 31 32] [33 34 35 36 37 38 39 40] | 
直接將矩陣內所有元素扁平化,依序取出所有元素!此功能必須搭配for-loop, while-loop使用!
扁平化就會變成一維陣列!
| 1 2 3 | b = np.arange(1, 13).reshape(3, 4) for element in b.flat:     print(element) | 
| 1 2 3 4 5 6 7 8 9 10 11 12 | 1 2 3 4 5 6 7 8 9 10 11 12 | 
什麼是From Function?
格式是一種可以透過一個自定義的函數和陣列座標值(index)來建構陣列的方法!
所以,需要先建立一個函數!
np.fromfunction(函數名稱, 形狀, 資料型別)
下列範例設定的參數分別是:
函數my_f(row, col),會用row*5 + col作為每一個陣列位置的數值。
形狀為(5, 5):就代表要產生5-by-5的矩陣!
資料型別就不必多解釋了,就是產生型別為int的矩陣!
| 1 2 3 4 5 6 7 8 9 10 11 | def my_f(row, col):     return row*5 + col b = np.fromfunction(my_f, (5, 5), dtype=int) print(b) print() print(b[0:5, 4]) print() print(b[:, 4]) | 
| 1 2 3 4 5 6 7 8 9 | [[ 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]] [ 4  9 14 19 24] [ 4  9 14 19 24] | 

 
             
						 
						 
						 
						 
						