如何計算list?使用Numpy
** Numpy package需要自行安裝 **
Numpy是Numeric Python的縮寫。首先先召喚 Numpy ,接著使用 numpy.array
來轉變原本 list
的屬性:
# 召喚Numpy,為了節省時間之後叫它為np
Import numpy as np# 把原本的list轉變成array並取名為height_np和weight_np
height = [1.73, 1.68, 1.71, 1.89, 1.79]
height_np = np.array(height)weight = [65.4, 59.2, 63.6, 88.4, 68.7]
weight_np = np.array(weight)print(height_np)
#結果為:array([1.73, 1.68, 1.71, 1.89, 1.79])print(weight_np)
#結果為:array([65.4, 59.2, 63.6, 88.4, 68.7])
weight_np
和 height_np
的資料格式都已經變成 array
,而不是原本的 list
。兩者差異如下:
若是 list
相加:
height + weight = [1.73, 1.68, 1.71, 1.89, 1.79, 65.4, 59.2, 63.6, 88.4, 68.7]
若是 array
相加:
height_np + weight_np = [67.13, 60.88, 65.31, 90.29, 70.49]
回到一開始,建立了weight_np
和 height_np
之後,我們可以使用簡單算式快速計算每個人的BMI:
bmi = weight_np / height_mp ** 2bmi
#結果為:array([21.852, 20.975, 21.75, 24.747, 21.441])
Numpy Array的限制?
- 不像
list
,Numpy
的array
只能包含一種資料型態,可以是strings/ integers/ boolean/ float。 - 可以把
array
視為一種新的資料型態,所以python基礎的method都可以在array上執行。
Numpy subsetting
array
與 list
十分接近,我們也可以用array
來篩選/ 擷取出我們需要的資料:
#以下bmi的資料型態是array,非list
bmi = [21.852, 20.975, 21.75, 24.747, 21.441]# 我們要找出bmi小於21.5的人。首先建立一個新的array,並將其命名為light
light = bmi < 21.5print (light)
# 結果為[False, True, False, False, True]print(bmi[light])
#意思是,以light去篩選bmi array中True值並回傳,而顯示為True值的人代表他們的BMI小於21.5
#結果為[20.975, 21.441]
2D Numpy arrays
前面提到可以把 array
視為一種新的型態,所以我們若用 type
去查詢array
會發生什麼事?
import numpy as np
height_np = np.array([1.73, 1.68, 1.71, 1.89, 1.79])
weight_np = np.array([65.4, 59.2, 63.6, 88.4, 68.7])type(height_np)
#結果為numpy.ndarray
numpy.darray
的numpy.
這是numpy packag定義的type。darray
的d是指dimension,而這邊的height_np和weight_np是one-dimension array。
但如果我們把 height_np
和 weight_np
結合在一起,會成為一個2D的array
:
height_n_weight_np = np.array ([[1.73, 1.68, 1.71, 1.89, 1.79],
[65.4, 59.2, 63.6, 88.4, 68.7]])height_n_weight_np.shape
#結果為(2, 5)
#意思是2 rows, 5 columns
#row = 橫列
#columns = 直欄
.shape
是查詢這個array
的欄 & 列,用來查詢這個array
的結構。
2D array可以幫我們更有效率的編輯/計算這些資料。接下來,學習如何擷取2D array的資料:
height_n_weight_np = np.array ([[1.73, 1.68, 1.71, 1.89, 1.79],
[65.4, 59.2, 63.6, 88.4, 68.7]])height_n_weight_np.shape
(2, 5)#我們想要第一橫列的資料:
height_n_weight_np[0]
[1.73, 1.68, 1.71, 1.89, 1.79]#想要第一橫列的第三個資料(1.71),有以下兩種方法:
height_n_weight_np[0][2]
1.71
1height_n_weight_np[0,2]
1.71#想要擷取一部分的資料呢?例如我只要第二欄&第三欄的數據:
height_n_weight_np[:,1:3]
array ([[1.68, 1.71],
[59.2, 63.6]])
#第一個篩選條件代表橫列,只有:,意思是所有橫列都要。
#第二個篩選條件代表直欄,我們只要第二欄和第三欄,所以標示1:3。#試著擷取第二列的第三欄到第五欄資料:
height_n_weight_np[1, 2:]
[63.6, 88.4, 68.7]
Numpy的基本統計
Numpy之所以好用,是因為我們可以使用它快速計算一些統計數據。
我們改變一下剛剛的資料型態:
#定義A公司的全體職員的身高/體重如下array,該公司有10,000名員工:
company_np = np.array([[1.83, 70.2],
[1.64, 65.33],
[1.77, 85.2],
...,
[1.95, 89.87]])
使用numpy快速計算全體員工的身高平均值(mean)、中位數(median)、標準差(standard derivative):
np.mean(company_np[:,0])
#用[:,0]篩選company_np的第一欄,也就是身高np.median(company_np[:,0])np.std(company_np[:,0])
另外也可以計算身高與體重的相關係數:
(什麼是相關係數?兩個或幾個隨機變數之間線性關係的強度和方向。請自行google~)
np.corrcoef(company_np[:,0],company_np[:,1] )#結果如下:
array([[1. , -0.01802],
[-0.01803, 1. ]])
彩蛋:用Numpy幫忙生成資料
A公司的全體職員的身高/體重如下array,該公司有10,000名員工
A公司是虛構的,當然也不會有一萬名員工的身高及體重資料。不過,我們可以用Numpy來「製造」他們,使用的是 np.random.normal()
函數:
np.random.normal(loc, scale, size)#loc=平均值
#scale=標準差
#size=生成多少資料
合併兩個array成為一個2D array,這邊使用的是 np.column_stack
,需注意兩個array需要為相同尺寸。
array_1 = np.array([1, 2, 3])
array_2 = np.array([100, 200, 300])np.column_stack((array_1, array_2))array([[1, 100],
[2, 200],
[3, 300]])
既然有column,想必也會有row囉! np.row_stack
使用方法如下:
array_1 = np.array([1, 2, 3])
array_2 = np.array([100, 200, 300])np.row_stack((array_1, array_2))array([[1, 2, 3],
[100, 200, 300]])
回到一開始的目標,如何生成一萬名A公司的員工資料呢?
import numpy as np#首先生成身高與體重的raw data:
height_raw = np.random.normal(1.75, 0.2, 10000)
weight_raw = np.random.normal(60.5, 15, 10000)#將資料整理成小數點後2位:
height = np.round(height_raw, 2)
weight = np.round(weight_raw, 2)#把資料放入company_np這個2D array
company_np = np.column_stack((height, weight))