Python- Numpy 用法簡介

Yunya Hsu
8 min readJul 11, 2021

--

如何計算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_npheight_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_npheight_np 之後,我們可以使用簡單算式快速計算每個人的BMI:

bmi = weight_np / height_mp ** 2bmi
#結果為:array([21.852, 20.975, 21.75, 24.747, 21.441])

Numpy Array的限制?

  1. 不像 listNumpyarray只能包含一種資料型態,可以是strings/ integers/ boolean/ float。
  2. 可以把array 視為一種新的資料型態,所以python基礎的method都可以在array上執行。

Numpy subsetting

arraylist 十分接近,我們也可以用array 來篩選/ 擷取出我們需要的資料:

#以下bmi的資料型態是array,非list
bmi = [21.852, 20.975, 21.75, 24.747, 21.441]
# 我們要找出bmi小於21.5的人。首先建立一個新的array,並將其命名為light
light = bmi < 21.5
print (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.darraynumpy. 這是numpy packag定義的type。darray的d是指dimension,而這邊的height_np和weight_np是one-dimension array。

但如果我們把 height_npweight_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
1
height_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))

--

--

No responses yet