前天和昨天介紹完 Python 的基本語法後,今天開始接連幾天,會開始介紹重要的 Python library: NumPy, Pandas, Matplotlib,這些 library 將讓我們更有能力、更快速地處理資料。
NumPy 能夠支援 Python 進行大量的陣列與矩陣運算,同時也提供了大量的數學 library 讓提升 Python 運算速度。因此未來在進行機器學習的時候,我們將不可避免地大量使用到 NumPy 的功能。
把 NumPy 加入我們的專案當中
import numpy as np
接著,讓我們建立 NumPy 的 array
arr = np.array([1, 2, 3, 4, 5])
如果我們用 type()
來查看它的型別,將會發現它是 numpy.ndarray
而不是普通的 Python list
這裡你可能會問,為什麼我們不能直接操作 Python list,而要建立一個新的 NumPy array 呢?因為 NumPy array 的相對優勢在於
這裡我們用 np.zeros 這個方法來示範。這個方法可以幫我們建立各種陣列,其中的元素都將會是 0
。在建立陣列的時候,我們可以決定其維度,以及資料型別。
譬如,我們要建立一為陣列,長度為 4,資料型別為 int:
np.zeros(4, dtype=int)
建立二維陣列 (3x4)
np.zeros((3,4), dtype=int)
建立三維陣列 (2x3x4)
np.zeros((2,3,4), dtype=int)
如果我們將資料型別設定為 float,會發現陣列當中的元素都會主動帶上小數點。這裡我們換用另外一個方法 np.ones 來示範,顧名思義,他所產生的陣列,其中所有元素都會是 1
,不過因為我們同時指定資料型別為 float,因此我們會看到的是 1.
而不是 1
np.ones((2,3,4), dtype=float)
輸出結果可見下圖:
除了建立元素皆為 0 和 1 的陣列外,我們也可以用 np.full()
來指定特定值:
np.full((3, 4), 3.14)
(3,4) 代表我們要建立 3x4 的二維陣列,後面的 3.14 則是我們的指定值。
如果我們要建立元素為隨機值得陣列,方法如下:
np.random.random((3, 4))
你會看到陣列當中的元素,會是介於 0 到 1 之間的隨機值。
我們也可以設定元素為某個區間的隨機整數,譬如建立一個 3x4 的二維矩陣,其元素為 0 到 5 之間的隨機整數
np.random.randint(0, 5, (3, 4))
輸出結果可見下圖:
假設我們今天建立一個 2x3x4 的三維陣列,看起來長得像這樣
[[[6 9 9 8]
[2 0 8 7]
[3 8 1 2]]
[[4 5 7 8]
[5 0 7 6]
[1 2 7 2]]]
第一層的陣列裡面有兩個陣列;第二層的陣列裡面各有三個陣列,第三層的陣列裡面,各有四個元素。其實取值的方式很簡單,也就是一層一層的取下去。
譬如:我們要找陣列中的第一個元素(array)
arr[0]
我們要找陣列中的第一個元素中的第二個元素(array)
arr[0][1]
我們要找陣列中的第一個元素中的第二個元素中的第三個元素(int)
arr[0][1][2]
輸出結果可見下圖:
另外,我們也可以用上次提到的 :
的方法來取出我們想要的部分 (sub-array)。舉例來說,我們這裡用 arr = np.random.randint(0, 10, 10)
來建立一個一維陣列如下
[4 2 8 1 9 6 7 9 3 5]
如果想要從這個陣列取出 index 從 2 到 4 的元素:
arr[2:5]
如果想要從這個陣列當中,從 index 為 1 的元素開始,每隔 1 個元素挑選 1 個元素出來:
arr[1::2]
上面挑出的元素就是 index 為 1, 3, 5, 7, 9 的值。如果我們要挑出 0, 2, 4, 6, 8 則可以用
arr[0::2]
當然我們也可以每隔 2 隔元素才挑 1 個元素出來:
arr[1::3]
最後,我們也可以反向選值,譬如
arr[5::-1]
代表我們從 index 為 5 的元素開始,往回(index 較小的方向)挑選每一個元素出來,就會得到一個反序的陣列
array([6, 9, 1, 8, 2, 4])
上面介紹的取出 sub-array 的方式,也可以應用在二維、三維,以及更高維度的陣列。大家試著玩玩看吧!明天我們將介紹 NumPy 其他更強大的陣列操作功能