Numpy
內置array及一堆好用的小工具
包含向量/矩陣運算
也涵蓋統計,隨機,傅立葉轉換(?)
Numpy的array和之前的Tuple,List非常像
之前的各種資料型態固然方便,功能很多
但越多功能也就代表著速度越慢…
安裝
pip install numpy
匯入
import numpy arr = numpy.array([1,2,3,4,5])
試試看!
import numpy arr = numpy.array([1,2,3,4,5]) # 創造一個array print(arr) print(type(arr)) print(arr[2]) # 取值方式一樣 print(arr[0:2]) # 也可以Slice
題外話 利用import … as …
來偷懶 方便寫扣
import numpy as np arr = np.array([1,2,3,4,5])
註:簡報之後部分都不會再寫出import…
所以…現在是
QA Time!
arr = np.arange(2,16,3) # [2,5,8,11,14] # 和range很像 arr = np.zeros(4) # [0, 0, 0, 0] arr = np.ones(5) # [1, 1, 1, 1, 1] arr = np.linspace(0, 10, num=5) # [l,r]範圍取num個點 # 0, 2.5, 5, 7.5, 10
快速生出大array的方法 (2)
arr = np.empty(2) # [酷東西, 酷東西] arr = np.random.rand(5) # 長度為5 範圍為0~1 arr = np.random.randint(0,2,(4,3)) # 尺寸4*3 範圍為[0,2)
酷東西:undefined
所以…現在是
QA Time!
多維度Array
多維度?回想之前的巢狀List
List俄羅斯套娃
這是一個二維array 尺寸為3 (列 row) * 3 (行 column)
[
[1,4,7],
[2,5,8],
[3,6,9]
]
第一列為 [1,4,7]
第一行為 [1,2,3]
多維度array
基本上概念完全一樣
import numpy as np arr_0 = np.array(1) # 這是0維的 arr_1 = np.array([1,2,3]) arr_2 = np.array([[1,2,3],[4,5,6],[7,8,9]]) # 這是2維的
新東西 檢查維度用
維度數量也可以說是Rank(秩)
arr_2 = np.array([[1,2,3],[4,5,6],[7,8,9]]) print(arr_2.ndim) # 二維array/Rank = 2的array # output: 2
新東西 創造維度!
arr_2 = np.array([[1,2,3],[4,5,6],[7,8,9]]) arr_3 = arr_2[np.newaxis, :] # 多一個維度 print(arr_3.ndim) # output: 3 print(arr_3[0]) print(arr_2) # 可以發現以上兩個的內容完全一樣
除了可以看Rank 也可以看詳細的尺寸
arr_2 = np.array([[1,2,3],[4,5,6],[7,8,9]]) arr_3 = arr_2[np.newaxis, :] # 多一個維度 print(arr_3.shape) # (1, 3, 3)
所以…現在是
QA Time!
同一個array的資料,可以利用view來改變看待資料的方法
可以用view然後不指定內容來做出一個類似捷徑的資料
arr = np.array([1, 2, 3, 4, 5]) x = arr.view() print(x) arr[0] = 999 print(x) # 發現index = 0的元素被改成999了 z只是一個看待arr的方法
如果把arr的資料當作浮點數來看待,則印出來會是像x那樣
arr = np.array([1, 2, 3, 4, 5], dtype = np.int64) x = arr.view(float) # 用解讀float的方式解讀int的資料 print(x) # float/int都一樣佔8 Byte 但float有部分是紀錄小數點後的數值
arr = np.array([1,2.5,3,4,5]) arr_2 = np.array([1,2,3,4,5]) print(arr.dtype) # float64 print(arr_2.dtype) # int64
Copy就是把整個array複製一份出來
但也要注意shallow copy的問題!
arr = np.array([1, 2, 3, 4, 5]) x = arr.view() y = arr.copy() arr[0] = 999 print(x) print(y) # 不會被改到999
到目前還好ㄇ
跟捏泥巴一樣簡單
只要元素數量正確,就能任意改變陣列的尺寸大小!
x = np.arange(6) # 0,1,2,3,4,5 y = x.reshape(2,3) print(y) # 輸出尺寸為2*3的矩陣 #[[0 1 2] # [3 4 5]]
真的只要元素數量正確就好
x = np.arange(6) # 0,1,2,3,4,5 w = x.reshape(1,1,1,1,1,6) # 維度控制大師(X) print(w)
不會除法也能當維度控制大師!
arr_2 = np.arange(1236) # 有1236個元素 z = arr_2.view() z.shape = (2,103,-1) # 不知道某個維度方向長度時 可以用-1來代替 np會幫忙算好 print(z.shape) # (2,103,6)
View能換個視角看資料
那能不能換個尺寸看資料?可以!
arr = np.array([1,2,3,4,5,6]) x = arr.view() x.shape = (2,3) # 換尺寸 print(x)
捏形狀還熟悉嗎
這是最後一張了
array也內建直接運算
最大/小/平均/標準差的函式 學到賺到!
a = np.arange(5,2391,19).reshape(2,3,7,3) # 有126個元素 print(a.min()) # 所有元素最小值 print(a.max()) # 所有元素最大值 print(a.sum()) # 所有元素之和 print(np.std(a)) # 標準差 print(np.mean(a)) # 平均
剛剛已經會整理資料了
現在來把資料畫出來!
安裝之後 要使用前請記得匯入
from matplotlib import pyplot as plt import matplotlib.pyplot as plt
以上兩種方式都可以
到這裡還好ㄇ?
畫圖分成三步驟
import matplotlib.pyplot as plt x = [10,20,30,40] y = [20,10,25,50] # 點的座標分別會是(10,20), (20,10), (30,25), (40,50)
plt.plot(x, y,"rs-") # 將資料丟給plt # r 紅色, s square, - 直線 plt.title("Example") # 設定標題等 plt.ylabel("y-axis") plt.xlabel("x-axis")
大家有成功show出來了ㄇ
顏色
可用kwarg
#RGB, 0~1
color=(255/255,100/255,100/255)
點樣式
線條樣式
畫出一個正方形
邊長為10
藍色
虛線
鑽石頂點,其中兩個頂點在(0,0), (10,10)
import matplotlib.pyplot as plt x = [0,10,10,0,0] y = [0,0,10,10,0] plt.plot(x, y,"bd:") # 將資料畫出來 plt.title("Blue square") # 設定標題等 plt.show() # 將圖表顯示出來
有點醜但還是正方形的吧
利用axis,給入有四個數字的list
就會把比例尺設定在對應範圍中
plt.plot([0,1,2,3,4],[0,1,8,27,64]) plt.axis([0, 5, 0, 70]) #[x始 x終 y始 y終] plt.show()
想畫出數學課本上滑滑的圖嗎
教你一招!不用一個一個座標慢慢打
回想numpy教的linspace
x = np.linspace(0,5,21)# [0,5]之中取21個點 plt.plot(x,x**2) # x軸為0~5的數字 y軸為0~5的數字平方後的結果 plt.show() #生出0~5之間 y = x^2的圖
直方圖 Histogram
y值為提及x的次數
plt.hist([2,2,6,8])
一個一個打有點累,我們可以借助np.random來產出一堆資料
這裡隨便挑一個normal distribution做示範
import numpy as np x = np.random.normal(0,1,1000) # 平均為0 標準差為1的常態分佈試驗1000筆 plt.hist(x) plt.show()
有興趣也能print(x)看看裡面有什麼
點分佈圖
scatter
#點座標分別為(5,10) (2,5) (9,8) (4,4) (7,2)
plt.scatter([5, 2, 9, 4, 7], [10, 5, 8, 4, 2])
plt.show()
長條圖
bar
# 一樣給x y座標 plt.bar([5, 2, 9, 4, 7], [10, 5, 8, 4, 2]) plt.show()
以上都有一個個試過了ㄇ
還有很多沒講的