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] |