NumPy 1.14 教學 – #08 用布林陣列當索引取值(Indexing with boolean array)
開始學NumPy之前至少先熟悉Python基礎使用方法,這樣再來看NumPy才不會那麼吃力!
Python3 教學、筆記本文將會介紹如何以判斷式對篩選整個矩陣符合條件的元素,進而產生布林矩陣,以便我們用在整個矩陣的數值修改或判斷!這個用法在進行矩陣運算時很常用到。
練習範例同步放置於GitHub:Learn NumPy – GitHub
by Elements/ by Cells
判斷每一個元素 Elements / Cells
判斷矩陣a中每一個位置的數值是否符合我們設定的條件,再將這個判斷結果儲存成一個布林(boolean)矩陣。
布林矩陣的大小會跟矩陣a的大小一致,所以可以直接使用這個布林矩陣當作矩陣a的索引值,NumPy會篩選布林矩陣值為True的位置的元素。
本範例在第3行直接用條件 < 20 判斷是符合這個條件的元素位置,產生布林矩陣filter。
第11行處,直接選取布林矩陣filter為True的元素對應到矩陣a的位置的值更改為0。
1 2 3 4 5 6 7 8 9 10 11 12 |
a = np.arange(25).reshape(5, 5) # 從矩陣a中篩選出數值小於20的index位置,並依此邏輯建立篩選器filter filter = a < 20 print('a=>\n{0}'.format(a)) # 看看篩選器filter長怎樣 print('filter=>\n{0}'.format(filter)) print('') print('Replace numbers with zero that number is small than 20:') # 直接將篩選器作為index數值,將篩選器數值為True對應到a矩陣位置的數值更改為0 a[filter] = 0 print('a=>\n{0}'.format(a)) |
Output
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
a=> [[ 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]] filter=> [[ True True True True True] [ True True True True True] [ True True True True True] [ True True True True True] [False False False False False]] Replace numbers with zero that number is small than 20: a=> [[ 0 0 0 0 0] [ 0 0 0 0 0] [ 0 0 0 0 0] [ 0 0 0 0 0] [20 21 22 23 24]] |
by Rows/ by Columns
依據 Rows / Columns 判斷
既然NumPy可以透過布林矩陣作為篩選條件過濾矩陣內的每一個元素,那一定也可以以這種方式對矩陣選取需要的Row或Column!做法也很簡單,建立一個布林陣列,陣列大小與這次的目標矩陣a的Row或Column數相等,就可以依據欲作篩選的維度進行篩選a[維度1, 維度2, …]。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
a = np.arange(12).reshape(3,4) print('a=>\n{0}'.format(a)) print('') b1 = np.array([False,True,True]) b2 = np.array([True,False,True,False]) print('b1=>{0}'.format(b1)) print('b2=>{0}'.format(b2)) print('') print('Display rows in matrix "a" that are selected by array "b1":') # 使用b1作為矩陣a的row篩選器,印出b1值為True對應到a矩陣的數值 print('a[b1,:]=>\n{0}'.format(a[b1,:])) print('') print('Display columns in matrix "a" that are selected by array "b2":') # 使用b2作為矩陣a的column篩選器,印出b2值為True對應到a矩陣的數值 print('a[:,b2]=>\n{0}'.format(a[:,b2])) |