NumPy 1

了解 NumPy array 基礎功能

函數庫 (Library)​

函數庫是 Python 開發來提升計算效率,例如 NumPy 和 pandas 都是常用的封包用來處理數值計算和組織文件。

你可以把封包視為了解決某種領域所集合的函數、方法與物件。例如 NumPy 就有許多計算和統計的物件讓你可以直接使用,不用從頭再創建或定義函數。你只需要導入函數庫就可以用已定義好的函數、方法和物件。我們來看一個例子:

# no pec price = [35, 44] discount = [0.9, 0.7] print(price * discount)

這裡有兩個物品的價錢和折扣,但我們卻不能輕易的輸出折扣後的價錢。執行代碼你會看到錯誤訊息 TypeError: can’t multiply sequence by non-int of type 'list'

因為 Python 不允許在列表中相乘(35乘0.9 和 44乘0.7),這樣看起來很顯而易見但無法在基本的運算中做到,這時函數庫就應映而生。下面我們用 NumPy 函數庫來解決:

# no pec import numpy as np price = np.array([35, 44]) discount = np.array([0.9, 0.7]) print(price * discount)

在第一行我們做了兩件事。第一是將 NumPy 導入 import numpy as np,告訴電腦我們將其函數庫導入。第二件事是將 NumPy 縮寫成 np 避免攏長編碼。

我們創建兩個變量,類似於前面的方法只是多了 np.array(),他是一個 NumPy 的方法,目前你可以先將它視為另一種類型的列表,我們會在下一章詳細說明。

執行編碼後就會看到我們想要的結果:打折後的價錢。

函數庫在 Python 數據科學中非常常見。你會高頻率的在接下來的課程中看到 NumPy 和另一個函數庫 pandas 的應用。

練習:導入一個函數庫

我們來練習如何導入封包。試著導入 NumPy 封包然後將他所寫成 np

# no pec import None as None height = np.array([1.71, 1.85, 1.68]) weight = np.array([73,85,82]) BMI = weight/height**2 print(BMI) import numpy as np height = np.array([1.71, 1.85, 1.68]) weight = np.array([73,85,82]) BMI = weight/height**2 print(BMI) Ex().check_object('BMI').has_equal_value() success_msg("Great job!")

輸出兩個 array 想成所得到的結果,但究竟什麼是 array?

數組 (Array)

數組是組成 NumPy 函數庫的基本元素,也是最大的原因讓 NumPy 用極低計算成本卻有效卻的方式處理數字計算。

數組簡單的來說代表著 一個維度的數字集合。下面我們來比較列表和 NumPy 的運算。

# no pec import numpy as np a_list = [1, 2, 3, 4] an_array = np.array([1, 2, 3, 4])

我們導入 NumPy 並創建一個表單 a_list。我們用 np.array() 函數把表單轉換成 NumPy array 物件 an_array

首先,我們試著先把兩個表單 a_list 加在一起。

# no pec a_list = [1, 2, 3, 4] print(a_list + a_list)

結果得到了兩倍大的表單。再來,我們把兩個 array 物件 an_array 相加。

# no pec import numpy as np an_array = np.array([1, 2, 3, 4]) print(an_array + an_array)

我們得到了滿意的答案。從這裡可以看出,Python 視表單相加為兩個物件的集合;而 array 則是真正數字的相加。

練習:創建一個 array

試著轉換表單 score 成一個 NumPy array 物件。

# no pec import None as np score = [78, 91 ,88, 84] score_np = np.None(None) print(score_np) import numpy as np score = [78, 91 ,88, 84] score_np = np.array(score) print(score_np) Ex().check_object('score_np').has_equal_value() success_msg("Great job!")
首先你必須導入 NumPy 然後用np.array()將列表轉換成 array。

我們來檢查一下 score_np 的物件類型。

# no pec import numpy as np score = [78, 91 ,88, 84] score_np = np.array(score) None(score_np) import numpy as np score = [78, 91 ,88, 84] score_np = np.array(score) type(score_np) Ex().check_function('type').has_equal_value() success_msg("Great job!")
如果你忘記的話,我們前面用過type()來輸出物件類型。

擷取子集合 (Subsetting)​

我們來創建一個數組叫 price

跟列表一樣你可以用 方括號 []  擷取數組中的元素。

# no pec import numpy as np price = np.array([3, 2.99, 0.97]) print(price[0])

如果你想找出在 price 裡有哪些數值超過 2.5,你可以用:

# no pec import numpy as np price = np.array([3, 2.99, 0.97]) print(price > 2.5)

他輸出一組布林值,就是在數組裡有哪些元素符合這些條件(大於2.5)。

事實上,你可以將這個條件直接應用在數組裡(看起來有點重複),他會輸出所有符合條件的元素。

# no pec import numpy as np price = np.array([3, 2.99, 0.97]) print(price[price>2.5])

你可以擷取並更改其中一個元素。

# no pec import numpy as np price = np.array([3, 2.99, 0.97]) print(price[price>2.5])

練習:擷取數組子集​

轉換 rating_list 成一個 NumPy array 物件 rating

試著調整 rating_adj 讓他成為 rating_adj = rating*1.3

# no pec import numpy as np rating_list = [3, 4.1 ,4.3, 2.5] rating = None.None(None) rating_adj = rating * None print(rating_adj) import numpy as np rating_list = [3, 4.1 ,4.3, 2.5] rating = np.array(rating_list) rating_adj = rating * 1.3 print(rating_adj) Ex().check_object('rating_adj').has_equal_value() success_msg("Great job!")

接下來,試著輸出所有大於 的元素。

# no pec import numpy as np rating_list = [3, 4.1 ,4.3, 2.5] rating = None.None(None) rating_adj = rating * None answer = None[None > 5] print(answer) import numpy as np rating_list = [3, 4.1 ,4.3, 2.5] rating = np.array(rating_list) rating_adj = rating * 1.3 answer = rating_adj[rating_adj > 5] print(answer) Ex().check_object('answer').has_equal_value() success_msg("Great job!")
類似於sorted()函數使用reverse=True參數來降序排列列表。

數組單一類型​

在每一個 NumPy 數組中,只會存在一種物件類型。如下,price 數組儲存了浮點數型(float)元素,如果你改變第一個元素為字串型,你會看到錯誤訊息。

# no pec import numpy as np price = np.array([3, 2.99, 0.97]) price[0] = "three"

這就是為什麼 NumPy array 能很有效率的計算數據,因為在每以個數組中只存在有一種類型數據。

在 arrays 輸出的時候會自動轉換成單一種數據類型,這個步驟叫強迫轉換 coercion。整數和浮點型數據可以被輕易轉換成字串,布林值也可以轉換成數字,但文字只能被視為字串型(str)。所以在 array 裡一但有字串型,輸出時所有元素就會被轉換成文字。

# no pec import numpy as np price = np.array(["three", 2.99, 0.97]) print(price)

那麼假設我們有一個數組儲存了字串、布林和浮點類型的數據,輸出的時候會被轉換成字串。

當你修改一個原本是浮點型的元素成布林值時,True 會被視為 1 False 會被視為 0。

# no pec import numpy as np price = np.array([3, 2.99, 0.97]) price[2] = True print(price)

練習:數組單一類型​

執行下面的編碼,試著理解哪些數值被強迫轉換 coercion

# no pec import numpy as np print(np.array([5, True, 2.2])) print(np.array([False, 0, 17]))

接下來,我們有兩個 array 我們希望輸出的結果為:[7., 96., 51.2]。試著完成編碼,你可以用數字或 True/False。

# no pec import numpy as np answer = np.array([None, 96, 50.2]) + np.array([False, 0, None]) print(answer) import numpy as np answer = np.array([7, 96, 50.2]) + np.array([False, 0, True]) print(answer) Ex().check_object('answer').has_equal_value() success_msg("Great job!")

你已經學會了 NumPy 中和如何擷取數組子集和僅存在單一類型的重要觀念。下一章我們將學習多維度數組。

請告訴我們

請告訴我們您的問題或勘誤建議。
您的意見是我們前進的動力,非常感激!