2020年8月28日 星期五

Python Access Multi Dimensional Array 多維陣列的存取

在機器學習或是人工智慧上
以 Python 為主會遇到一個套件是 NumPy
他在陣列的存取上極其方便
以致後續對於陣列(array)操作 / 矩陣(matrix)運算 / 卷積(convolution)計算都用得上
這邊把學習到的心得整理起來已備後續查找用

以往存取陣列就是用元素存取
例如 X[0][0] 這種
如果要有條件通常就是跑迴圈
而在 Python 裡面則已經內建與法處理掉這種事情
讓程式可讀性(習慣的話)以及效率提升

一開始搞不太懂也不看教程
其實不自己測試只看教程真的是看了也沒懂 (沒fu)
 
首先在一維陣列裡面
x = np.array([0, 1, 2, 3, 4])
x[n]: 取第幾筆
還有一種是可以指定的
格式為 x[start: end: delta]
delta 就是 interval 可以負號則反向
也就是說要抓這個陣列可以給予起始 ~ 結束-1 多久取一次
就是 for (i = start; i < end; i += delta) print(x[i])
delta 負號則為 for (i = end - 1; i >= start; i -= delta) print(x[i])
但是因為是內部處理所以比 for loop 快很多
所以
x[0:3:1] = [0, 1, 2]
x[0:3:2] = [0, 2]
x[2:4:2] = [2]
x[0:] = [0, 1, 2, 3, 4] # 沒寫就是預設
預設是 x[0: length: 1] 以這個例子為 x[0:5:1]
負號則為 x[length-1: 0: -1] 
x[:2:] = [0, 1]
x[1::2] = [1, 3]
x[2::-1] = [2, 1, 0]
x[:1:-2] = [4, 2]
x = x[:] = x[::] = [0, 1, 2, 3, 4]

一維陣列的例子看完後 多維例子就很簡單
以一個三維陣列來說
原本存取有這樣的方式
y[l][m][n] 或是 y[l, m, n]
後者的 l m n 換成剛剛上面一維陣列的格式就可以用了
格式就是 y[ start:end:delta , start:end:delta , start:end:delta]
可以省略的可以簡寫的均相同


補充一下 np.shape(y) 可以查 array 維度