NumPy 1.14 教學 – #07 用陣列當索引取值(Indexing with array of indices)
開始學NumPy之前至少先熟悉Python基礎使用方法,這樣再來看NumPy才不會那麼吃力!
Python3 教學、筆記本文將介紹NumPy的矩陣/陣列的進階索引(argmax)方法,算是蠻特別的,目前我也還不清楚這個功能要用在哪裡?因為平常我們也會經常閱讀別人的程式,所以瞭解這些技巧也是必備技能之一!就當自我訓練吧~
練習範例同步放置於GitHub:Learn NumPy – GitHub
用一維陣列當索引
這個應該蠻好理解的,直接用一維陣列i值當作陣列a的索引值。
NumPy會直接回傳陣列i內每一個元素值對應到陣列a內索引位置的數值。
1 2 3 4 5 6 7 |
a = np.arange(10)**2 print('a=>{0}'.format(a)) print() i = np.array([1, 3, 5, 7, 9]) print('i=> {0}'.format(i)) print('a[i]=> {1}'.format(i, a[i])) |
1 2 3 |
a=>[ 0 1 4 9 16 25 36 49 64 81] i=> [1 3 5 7 9] a[i]=> [ 1 9 25 49 81] |
用二維陣列當索引
如果將上述用來做索引的陣列維度從一維改成二維會有怎樣的效果?
陣列j是二維陣列,用來對陣列a取值。
1 2 3 4 5 6 7 8 |
a = np.arange(10)**2 j = np.array( [[3, 4], [5, 6]] ) print('a=>{0}'.format(a)) print('j=>\n{0}'.format(j)) # Transforms the shape of a into j, and gets values. # 把a的形狀改成像j的形狀, 而且取得相對應index的值. print('a[j]=>\n{0}'.format(a[j])) |
1 2 3 4 5 6 7 |
a=>[ 0 1 4 9 16 25 36 49 64 81] j=> [[3 4] [5 6]] a[j]=> [[ 9 16] [25 36]] |
使用2個二維陣列當索引
這個用法也蠻神奇的,各位可以看看。
下列範例程式會用到3個陣列,其中a, b兩個陣列會分別用來作為矩陣x的第一維度和第二維度的索引值!
不過NumPy回傳的矩陣形狀也會跟a, b一樣,也就是說a和b的形狀必須一樣!
邏輯如下:
陣列x: 陣列a: 陣列b: |
使用陣列a, b對陣列x取值:x[a, b]
$\begin{bmatrix} |
1 2 3 4 5 6 7 8 9 10 11 12 |
print("Gets values by 2 arrays from a matrix.") x = np.arange(28).reshape(4, 7) a = np.array([[0, 1], [2, 3]]) b = np.array([[5, 5], [6, 6]]) print("x=>\n{0}".format(x)) print("a=>\n{0}".format(a)) print("b=>\n{0}".format(b)) # Array "a" will indicate the indices of row of the matrix "x". # Array "b" will indicate the indices of column of the matrix "x". # 陣列a將會指出矩陣x裡的row # 陣列b將會指出矩陣x裡的column print("x[a,b]=>\n{0}".format(x[a,b])) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Gets values by 2 arrays from a matrix. x=> [[ 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 25 26 27]] a=> [[0 1] [2 3]] b=> [[5 5] [6 6]] x[a,b]=> [[ 5 12] [20 27]] |
argmax
ndarray.argmax(axis=<dimension number>)
np.argmax(<ndarray>, axis=<dimension number>)
argmax這個功能會尋找你所指定的維度之中,最大值所在之處的索引值。
使用方式也有兩種,一個是直接使用作為資料來源的ndarray物件的方法。
另一種則是使用numpy的argmax方法來達成。
1 2 3 4 5 6 7 8 9 10 11 |
x = np.array([[1, 2, 3], [6, 5, 5], [7, 8, 9]]) print("x=>\n{0}".format(x)) print() # Find out the indices of max value along axis-0. # In this case, axis-0 means each rows in a 2 dimensional matrix. # 同column位置之中 數值最大的位置的row索引值. print("x.argmax(axis=0)=>{0}".format(x.argmax(axis=0))) # Find out the indices of max value along axis-1. # In this case, axis-1 means each columns in a 2 dimensional matrix. # 同row位置之中 數值最大的位置的column的索引. print("np.argmax(x, axis=1)=>{0}".format(np.argmax(x, axis=1))) |
1 2 3 4 5 6 7 |
x=> [[1 2 3] [6 5 5] [7 8 9]] x.argmax(axis=0)=>[2 2 2] np.argmax(x, axis=1)=>[2 0 2] |
同column位置之中最大的數值
1 2 3 4 5 |
# Find out the max values from each colunm of a 2 dimensional matrix. # 印出第2維度陣列中, 各column的最大的數值 print("Max in each colunms:") for idx in range(x.shape[1]): print( "The MAX value of column-{0}=> {1}".format(idx, x[x.argmax(axis=0)[idx], idx]) ) |
1 2 3 4 |
Max in each colunms: The MAX value of column-0=> 7 The MAX value of column-1=> 8 The MAX value of column-2=> 9 |
sum
ndarray.sum(axis=<dimension number>)
np.sum(<ndarray>, axis=<dimension number>)
同column位置之中 加總各row索引值!
1 2 3 4 |
# Summarize the values by each corresponding columns of a 2 dimensional matrix. # 加總每一個相對應欄位的數值 print("x=>\n{0}".format(x)) print("np.sum(x, axis=0)=>{0}".format(np.sum(x, axis=0))) |
1 2 3 4 5 |
x=> [[1 2 3] [6 5 5] [7 8 9]] np.sum(x, axis=0)=>[14 15 17] |