---
# System prepended metadata

title: 資研 4/26 社課講義
tags: [社課講義, 資研]

---

# 資研 4/26 社課講義

[**提問表單**](https://forms.gle/z4dPC1JPV6uA2q9w7)

---

## Numpy

[**Numpy 官網**](https://numpy.org/)

:::danger
中文翻譯都是參考用的，如果要查資料建議用英文去查！
:::

```python=
import numpy as np
```

### 重塑 reshape

使用`arr.reshape(a, b, c...)`將原本的矩陣重新組合成指定大小的多維矩陣

>a, b, c ... 為各維度中指定個數

:::warning
注意矩陣內的元素**總數**需相同，否則會報錯

>使用 -1 可以讓電腦自行運算

:::

```python=
arr = np.array([1, 2, 3, 4, 5, 6, 7, 8])
arr = arr.reshape(2, 4)
print(arr)
print(arr.shape)
```

### 疊加 stacking

分別利用`np.vstack((arr1, arr2))`、`np.hstack((arr1, arr2))`將兩 <font color="#CE0000">**Tuple、List、ndarray**</font> 依 **鉛直軸vertical axis 、 水平軸horizontal axis** 疊加，並一律用ndarray回傳值

:::warning
若使用`np.vstack`，則兩陣列**列數**需相同
若使用`np.hstack`，則兩陣列**行數**需相同

**arr1和arr2在傳入時需事先包裝成一個Tuple**
:::

```python=
# vstack 列數相同
arr1 = [[1, 2], 
        [3, 4], 
        [5, 6]]

arr2 = [[-1, 2], 
        [3, 4]]

np.vstack((arr1, arr2))
```
```python=
# hstack 行數相同
arr1 = [[1, 2], 
        [3, 4], 
        [5, 6]]

arr2 = [[-1, 2, 4], 
        [3, 4, 2], 
        [6, 8, 9]]

np.hstack((arr1, arr2))
```

### 轉置 transpose

$A$ 轉置後的矩陣記做 $A^T$，在程式中利用`arr.T`回傳轉置後的陣列

```python=
arr = np.array([[2, 3, 10], [4, -1, 3]])

print(arr)
print(arr.T)
```

### 迭代函數 arange

利用`np.arange(a, b, c)`可以直接創造出一個符合迭代函數的List

>a 是起點，b 是終點（不包含），c 是間隔

```python=
a = np.arange(10)
print(a)
```

### 線性間距向量 linspace

利用`np.linspace(a, b, c)`，在 a 和 b 之間取出平均的 c 個點

>範圍包含 a、b

```python=
a = np.linspace(1, 7, 3)
print(a)
```

### 矩陣乘法

程式上利用`np.dot(arr1, arr2)`或是`arr1.dot(arr2)`回傳相乘過後的矩陣

>`np.dot(arr1, arr2)`也適用於List

```python=
arr1 = np.array([[1, 2], [3, 4]])

arr2 = np.array([[-1, 2], [6, 10]])

print(arr1.dot(arr2))
print(np.dot(arr1, arr2))
```

### 解方程式

利用`np.linalg.solve(A, B)`可以回傳該方程式未知數矩陣的值

>A 是係數矩陣，B 是常數矩陣

$3x+6y=-9$
$-x-7y=13$

```python=
A = np.array([[3, 6], 
              [-1, -7]])
B = np.array([-9, 
              13])

print(np.linalg.solve(A, B))
```

:::info
**練習**
請利用此反矩陣函式`np.linalg.inv(arr)`，寫一個不需要用`np.linalg.solve(A, B)`也能解出方程式的函式

$A*X = B$
$\Rightarrow A*A^{-1}*X = B*A^{-1}$
$\Rightarrow X = B*A^{-1}$

```python=
A = np.array([[3, 6], [-1, -7]])
B = np.array([-9, 13])

A_inv = np.linalg.inv(A)

print(np.dot(A_inv, B))
```
:::

## Random

[**Random 官網**](https://docs.python.org/zh-tw/3/library/random.html)

```python=
import random
```

### randint

利用`random.randint(a, b)`隨機產生一個 a ~ b 間的整數

>有包含 b

```python=
random.randint(1, 10)
```

### random

利用`random.random()`隨機產生一個 0 ~ 1 間的實數

>有包含 0 不包含 1

```python=
random.random()
```

### randrange

利用`random.randrange(a, b, c)`以 c 為間隔，隨機產生一個 a ~ b 間的整數

>相當於在`np.arange(a, b, c)`中，隨機取一個數字

```python=
random.randrange(1, 100, 10)
```

### choice

從 A 中隨機抽取一個元素

>A 可以是 String、List、Tuple

```python=
L = [1, 23, 3, 4, 2, 7, 18, 29, 8, 72]
random.choice(L)
```

從 A 中隨機抽取 n 個元素（可能重複）

```python=
L = [1, 23, 3, 4, 2, 7, 18, 29, 8, 72]
random.choices(L, k=3)
```

### sample

從 A 中隨機抽取 n 個元素（不重複）

```python=
L = [1, 23, 3, 4, 2, 7, 18, 29, 8, 72]
random.sample(L, k=6)
```

### shuffle

將 A 中原本的元素順序打亂

```python=
L = [1, 23, 3, 4, 2, 7, 18, 29, 8, 72]
random.shuffle(L)
print(L)
```

:::info
**練習**
請試著用`random`寫出一個終極密碼（1~100）的程式

```python=
import random

seed = random.randint(1, 100)

game = True
ceil = 100
floor = 1
c = 0

while game:
  ans = int(input(f"請在{floor}~{ceil}之間猜一個數字"))
  if ans > seed:
    print("太大囉\n")
    ceil = ans
    c += 1
    continue
  elif ans < seed:
    print("太小囉\n")
    floor = ans
    c += 1
    continue
  else: # ans = seed
    c += 1
    break

print(f"恭喜遊戲結束，您猜對的正確答案為{seed}，一共猜了{c}次")
```
:::