---
###### tags: `資訊之芽`
---
# Numpy & Matplotlib
---
## 大綱
- Numpy 簡單介紹
- 小技巧
- 更多介紹
- View/Reshape
- 最後小撇步
----
## 簡單介紹
Numpy
內置array及一堆好用的小工具
包含向量/矩陣運算
也涵蓋統計,隨機,傅立葉轉換(?)
----
## 簡單介紹
Numpy的array和之前的Tuple,List非常像
之前的各種資料型態固然方便,功能很多
但越多功能也就代表著速度越慢...
----
## 簡單介紹
![](https://i.imgur.com/skGAHTl.jpg)
----
## 簡單介紹
安裝
```
pip install numpy
```
匯入
```python=
import numpy
arr = numpy.array([1,2,3,4,5])
```
----
## 簡單介紹
試試看!
```python=
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 ...
來~~偷懶~~ 方便寫扣
```python=
import numpy as np
arr = np.array([1,2,3,4,5])
```
註:簡報之後部分都不會再寫出import...
----
## 簡單介紹
所以...現在是
QA Time!
---
## 小技巧
```python=
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)
```python=
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
基本上概念完全一樣
```python=
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(秩)
```python=
arr_2 = np.array([[1,2,3],[4,5,6],[7,8,9]])
print(arr_2.ndim) # 二維array/Rank = 2的array
# output: 2
```
----
## 更多介紹
新東西 創造維度!
```python=
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 也可以看詳細的尺寸
```python=
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!
---
## View
同一個array的資料,可以利用view來改變看待資料的方法
可以用view然後不指定內容來做出一個類似捷徑的資料
```python=
arr = np.array([1, 2, 3, 4, 5])
x = arr.view()
print(x)
arr[0] = 999
print(x) # 發現index = 0的元素被改成999了 z只是一個看待arr的方法
```
----
## View
如果把arr的資料當作浮點數來看待,則印出來會是像x那樣
```python=
arr = np.array([1, 2, 3, 4, 5], dtype = np.int64)
x = arr.view(float) # 用解讀float的方式解讀int的資料
print(x)
# float/int都一樣佔8 Byte 但float有部分是紀錄小數點後的數值
```
----
## 確認array中的資料型態
```python=
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
```
更多補充:https://numpy.org/doc/stable/user/basics.types.html
----
## View vs Copy
Copy就是把整個array複製一份出來
但也要注意shallow copy的問題!
```python=
arr = np.array([1, 2, 3, 4, 5])
x = arr.view()
y = arr.copy()
arr[0] = 999
print(x)
print(y) # 不會被改到999
```
----
## QA 時間
到目前還好ㄇ
---
## Reshape
跟捏泥巴一樣簡單
只要元素數量正確,就能任意改變陣列的尺寸大小!
```python=
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]]
```
----
## Reshape
真的只要元素數量正確就好
```python=
x = np.arange(6) # 0,1,2,3,4,5
w = x.reshape(1,1,1,1,1,6) # 維度控制大師(X)
print(w)
```
----
## Reshape
不會除法也能當維度控制大師!
```python=
arr_2 = np.arange(1236) # 有1236個元素
z = arr_2.view()
z.shape = (2,103,-1) # 不知道某個維度方向長度時 可以用-1來代替 np會幫忙算好
print(z.shape) # (2,103,6)
```
----
## View補充!
View能換個視角看資料
那能不能換個尺寸看資料?可以!
```python=
arr = np.array([1,2,3,4,5,6])
x = arr.view()
x.shape = (2,3) # 換尺寸
print(x)
```
----
## QA Time!
捏形狀還熟悉嗎
---
## 最後小撇步!
這是最後一張了
array也內建直接運算
最大/小/平均/標準差的函式 學到賺到!
```python=
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)) # 平均
```
---
## Numpy End!
----
## Matplotlib
剛剛已經會整理資料了
現在來把資料畫出來!
----
## 大綱
- 安裝
- 安裝之外的
---
## 安裝
```
pip install -U matplotlib
```
或是參考[這裡](https://matplotlib.org/stable/users/installing/index.html)
不要按[這裡](https://www.youtube.com/watch?v=-ePcMwbgl14)
----
## 匯入
安裝之後 要使用前請記得匯入
```python=
from matplotlib import pyplot as plt
import matplotlib.pyplot as plt
```
以上兩種方式都可以
----
## QA Time
到這裡還好ㄇ?
---
## 基本語法
畫圖分成三步驟
- 給資料及格式
- 設定label
- show
----
## 簡單示範
```python=
import matplotlib.pyplot as plt
x = [10,20,30,40]
y = [20,10,25,50]
# 點的座標分別會是(10,20), (20,10), (30,25), (40,50)
```
----
## 簡單示範
```python=
plt.plot(x, y,"rs-") # 將資料丟給plt
# r 紅色, s square, - 直線
plt.title("Example") # 設定標題等
plt.ylabel("y-axis")
plt.xlabel("x-axis")
```
----
## 簡單示範
最後一步,[Show!](https://youtu.be/nrZxwPwmgrw?t=76)
```python=
plt.show()
```
(可以搭配音效)
----
## QA Time
大家有成功show出來了ㄇ
---
## 其他格式
顏色
可用kwarg
```
#RGB, 0~1
color=(255/255,100/255,100/255)
```
----
## 其他格式
點樣式
- \+
- \. 小圓點
- o 圓點
- s 小方格
- D 稜形/鑽石
- H 16邊形
----
## 其他格式
線條樣式
- : 虛線
- \- 直線
----
## 小練習
畫出一個正方形
邊長為10
藍色
虛線
鑽石頂點,其中兩個頂點在(0,0), (10,10)
----
## 小練習解答
```python=
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
就會把比例尺設定在對應範圍中
```python=
plt.plot([0,1,2,3,4],[0,1,8,27,64])
plt.axis([0, 5, 0, 70]) #[x始 x終 y始 y終]
plt.show()
```
![](https://i.imgur.com/QOAwCUc.png)
----
## 不同的圖
想畫出數學課本上滑滑的圖嗎
教你一招!不用一個一個座標慢慢打
回想numpy教的linspace
```python=
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的次數
```python=
plt.hist([2,2,6,8])
```
![](https://i.imgur.com/WuDNI8T.png)
----
## numpy random
一個一個打有點累,我們可以借助np.random來產出一堆資料
這裡隨便挑一個normal distribution做示範
```python=
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
```python=
# 一樣給x y座標
plt.bar([5, 2, 9, 4, 7], [10, 5, 8, 4, 2])
plt.show()
```
----
## QA Time
以上都有一個個試過了ㄇ
___
## 延伸
還有很多沒講的
- 3D圖形 [mplot3d](https://matplotlib.org/3.5.0/tutorials/toolkits/mplot3d.html)
- 4D圖形
- 時空穿越
- 烏托邦社會架構哲學問題
- 正確地騎乘魔法掃帚
- [選擇適合居住的維度指南](https://www.instagram.com/p/CbhAWZRP39H/?utm_medium=copy_link&fbclid=IwAR0h1zH4e4EbehIDmaXdJoYqcsspYaDAxluI2-BsvOp8vtJpd5ng7zAnwcI)
- 加值悠遊卡不可不知的10大秘訣
{"metaMigratedAt":"2023-06-16T20:31:52.591Z","metaMigratedFrom":"Content","title":"Numpy & Matplotlib","breaks":true,"contributors":"[{\"id\":\"12fd27f5-82a5-4f30-8a85-e747ae0676cf\",\"add\":22,\"del\":8},{\"id\":\"9a14c697-53b2-4214-a12a-512e946e0176\",\"add\":6825,\"del\":350}]"}