iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 13
1
AI & Data

Machine Learning for Dummies系列 第 13

[Day 13] Hello NumPy! (1)

  • 分享至 

  • xImage
  •  

前天和昨天介紹完 Python 的基本語法後,今天開始接連幾天,會開始介紹重要的 Python library: NumPy, Pandas, Matplotlib,這些 library 將讓我們更有能力、更快速地處理資料。

Hello NumPy!

NumPy 能夠支援 Python 進行大量的陣列與矩陣運算,同時也提供了大量的數學 library 讓提升 Python 運算速度。因此未來在進行機器學習的時候,我們將不可避免地大量使用到 NumPy 的功能。

NumPy 起手式

把 NumPy 加入我們的專案當中

import numpy as np

接著,讓我們建立 NumPy 的 array

arr = np.array([1, 2, 3, 4, 5])

如果我們用 type() 來查看它的型別,將會發現它是 numpy.ndarray 而不是普通的 Python list

Imgur

這裡你可能會問,為什麼我們不能直接操作 Python list,而要建立一個新的 NumPy array 呢?因為 NumPy array 的相對優勢在於

  1. 使用更少的儲存空間
  2. 有更快的速度
  3. 以及有 NumPy 與 SciPy 等 library 各種優化過、更強大的功能的支援

快速建立各種不同的陣列 (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)

輸出結果可見下圖:

Imgur

建立元素為指定值或隨機值的陣列

除了建立元素皆為 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))

輸出結果可見下圖:

Imgur

從陣列當中取值

假設我們今天建立一個 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]

輸出結果可見下圖:
Imgur

取出 sub-array

另外,我們也可以用上次提到的 : 的方法來取出我們想要的部分 (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])

Imgur

上面介紹的取出 sub-array 的方式,也可以應用在二維、三維,以及更高維度的陣列。大家試著玩玩看吧!明天我們將介紹 NumPy 其他更強大的陣列操作功能


上一篇
[Day 12] More about Python!
下一篇
[Day 14] Hello NumPy! (2)
系列文
Machine Learning for Dummies30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言