---
tags: 教學, 教學4, AUV, python
---
:::info
https://hackmd.io/@NCTU-auv/ByWBWPPn8
:::
[TOC]
# Python套件
## pip
:::info
**簡介**
pip 是 python套件管理器
可以透過pip安裝、更新、移除python套件
:::
### 安裝方法
```shell=
sudo apt install python-pip #python2
sudo apt install python3-pip #python3
pip install numpy
pip3 install numpy
```
## import
:::info
若要使用某套件,要先import才可以使用。
:::
### import套件的方法
* ```import <套件名>```
* ```import <套件名> as <簡稱>```
* ```from <套件名> import <特定功能>```
### example
```python=
import numpy #引入名為numpy的模組
print(numpy.pi)
import numpy as np #引入名為numpy的模組,並命名為np
print(np.pi)
from numpy import pi
print(pi)
```
## Numpy
:::info
一個好用的數學運算模組
提供與matlab 相似的功能
常常與 ==matplotlib== 一同使用
:::
### for example
```python=
import numpy as np
coeff = [3.2,2,1] #方程式係數為 3.2x^2+2x+1
np.roots(coeff)
```
**不過其實numpy這個功能博大精深,今天僅大概介紹最基礎的資料儲存部份**
### numpy array 與 list 的不同:
numpy array 與 list 是很相像的
然而list 中的子元素可以是各式各樣的,這種方式當然有他的方便之處,但是這樣靈活的儲存方式卻是相當的消耗記憶體與cpu
而numpy array 則規定了只能有一種資料儲存方式,這種結構與C++類似,效率也比較高
### 宣告方式
==注意 一定是用中括弧"[ ]包起來"==
#### 直接列出來宣告
```python=
import numpy as np
wrong = np.array(1,2,3)
a=np.array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]]) #整數宣告
b=np.array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]],dtype=float) #浮點數宣告
#可用 np.dtype 查詢
```
#### 特殊宣告功能
1. arrange
```python=
array1 = np.arange(10)
array2 = np.arange(1,10,0.1)
#vs range
list1 = list(range(10))
list2 = list(range(1,10,0.1)) #只能是整數
```
2. linspace
```python=
array1 = np.linspace(0,8,100)
#在 0~ 8 之間插入100個數
```
3. reshape
```python=
array1 = np.linspace(0,8,100)
array1 = array1.reshape(20,5) #將 array 變成 20*5的矩陣
array1 = np.linspace(0,7,100).reshape(4,25) #可以寫成一串
```
4. zeros & ones
```python=
array1 = np.zeros((3,4))
array2 = np.ones((2,3,4))
#vs range是整數
```
### 基本計算
#### 加減乘除
此處的加減乘除並非矩陣的乘除,而是對相對應的數字做計算
```python=
a = np.arange(10,60,10) #a=10 20 30 40 50
b = np.arange(1,6,1) #b=1 2 3 4 5
print(a-b)
print(a+b)
print(a*b)
print(a/b)
print(b**2)
a+=a #就像C++一樣
print(a)
c = np.linspace(0,90,100)
print(np.sin(np.deg2rad(c)))
d = np.linspace(0,np.pi/2,100)
print(np.sin(d))
print(c<45)
```
#### 矩陣相乘
A:
| 1 | 1 |
| -------- | -------- |
| 0 | 1 |
B:
| 2 | 0 |
| -------- | -------- |
| 3 | 4 |
```python=
A = np.array( [[1,1],[0,1]] )
B = np.array( [[2,0],[3,4]] )
print(A@B)
print(A.dot(B))
```
### index
array1
| 10 | 20 | 30 | 40 | 50 | 60 | 70 | 80 | 90 | 100 |
| -------- | -------- |-------- |-------- |-------- |-------- |-------- |-------- |-------- |-------- |-------- |
array2
|10. | 10.90909091| 11.81818182| 12.72727273| 13.63636364|
| -------- | -------- |-------- |-------- |-------- |
| 14.5454545| 15.45454545| 16.3636363| 17.27272727| 18.18181818|
| 19.0909090| 20. | 20.90909091| 21.81818182| 22.72727273|
| 23.63636364| 24.54545455| 25.45454545| 26.3636363| 27.27272727|
| 28.18181818| 29.09090909| 30. | 30.90909091| 31.81818182|
| 32.72727273| 33.63636364| 34.54545455| 35.45454545| 36.36363636|
| 37.27272727| 38.18181818| 39.09090909| 40. | 40.90909091|
| 41.81818182| 42.72727273| 43.63636364| 44.54545455| 45.45454545|
| 46.36363636| 47.27272727| 48.18181818| 49.09090909| 50|
| 50.90909091| 51.81818182| 52.72727273| 53.63636364| 54.54545455|
| 55.45454545| 6.36363636| 57.27272727| 58.18181818| 59.09090909|
| 60.| 60.90909091| 61.81818182| 62.72727273| 63.63636364|
| 69.09090909| 70. | 70.90909091| 71.81818182| 72.72727273|
| 73.63636364| 74.54545455| 75.45454545| 76.36363636| 77.27272727|
| 78.18181818| 79.09090909| 80. | 80.90909091| 81.81818182|
| 82.72727273| 3.63636364|84.54545455| 85.45454545| 86.36363636|
|87.27272727|88.18181818|89.09090909|90. | 90.90909091|
|91.8181818|92.72727273|93.63636364|94.54545455| 95.45454545|
| 96.36363636|97.27272727|98.18181818| 99.09090909| 100|
```python=
array1 = np.linspace(10,100,10)
array1[0]
array1[0:3]
array1[:]
array1[::-1]
array2 = np.linspace(10,100,100)
array2 = array2.reshape(20,5)
array2[:,:]
array2[:,1:3]
array2[2:4,1]
array2[0,-2] #倒數第二個
```
# homework
繳交方式說明
```
scp -P 'Port' "檔名" 帳號@ip:要存的路徑
```
## hw1
讀取以下json檔,計算出10秒後,物體的位移(m)
https://drive.google.com/file/d/11AgYNS6zUCh1n1yoiF6PSTtjz_ylaNA3/view?usp=sharing
備註:
1. 必須使用'numpy'
2. 假設輸入檔案名稱皆為homework.json
3. 若Json檔沒有此項資料,vel,force default=0 ,Mass default=1
hint : https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.inv.html
Json資料的Key:
```
Mass : 質量(kg)
vel_x: X方向初速(m/s)
vel_y: Y方向初速(m/s)
vel_z: Z方向初速(m/s)
Force_x : X方向的分力(N)
Force_y : Y方向的分力(N)
Force_z : Z方向的分力(N)
```
#### Example:
INPUT:
```
homework.json
```
OUTOUT:
```
position_x: 10
position_y: 50
position_z: 5
```