###### tags: `課程共筆`
# Tensors
## Q1 Tensor是什麼?跟Vector/Matrix差在哪裡?
Vector(向量): 一維陣列(array),可以表達一串訊號、一列價格、人的身高、N維向量等等。
`e.g. [2,2,3], shape=(3,)`
> 註: 通常N維陣列跟N維座標指的維度不一樣。N維陣列的每一維都可以說是$K_n$維座標。為了好區分,正式來講,N維陣列應該叫做N秩(rank)陣列或N軸(axis)陣列。
Matrix(矩陣): 二維陣列, 會有行跟列(長度為長跟寬)。
`e.g. [[1,2,3,4],[2,2,3,4]], shape=(2,4)`
Tensor(張量): 不限維度的陣列,可以到三維以上
`e.g. [[[1,2,3,4],[2,2,3,4]],[[1,2,3,4],[2,2,3,4]]], shape=(2,2,4)`
> P.S. 在物理上張量代表某個受力面受某另個方向受力,
e.g. $\sigma_{21}$代表紅色受力面(面1)被往方向2拽的強度,若只有這個張量,正方體會在水平方向逆時鐘旋轉。
就是向量已經不足以表達施力狀態才會有Tensor這個新詞彙。

## Q2 Dimension跟rank是什麼
在資料科學的領域,常常"維度"這個詞會造成很多困擾、混淆。
**座標:**
一個向量 [2,2,3],我們說他可以代表一個"3維"卡氏座標。

**陣列:**
而一個shape是[2,2,3]的陣列,被說是"3維"陣列,也是"3維"張量。

**Dimension(維度):**
獨立參數的數量,獨立參數比如說空間的xy位置、時間軸、總風量、溫度等等。
**Tnsor Rank(張量的秩)/Axis(軸):**
對於tensor而言是在說張量維度,也是看待tensor的獨立方向數。
例如前面陣列的每個axis中會有數個項目,
> e.g. 第一個軸有兩個項目:
tensor[0,...]=[[0,5],[0,5],[0,5]],
tensor[1,...]=[[3,0],[3,0],[3,0]]
## Q3 Tensor operation為什麼要指定操作的軸?
Tensor有很多可做的操作項目需要指定操作的軸,例如加總(sum)、乘積(production)、矩陣相乘(Matrix multiplication)、捲積(convolution)等等。有可能有各種情況:
1. 在指定操作維度(軸)下,會列舉(enumerate)該軸所有項目計算,計算後會使該軸消失。
> e.g.將一個內容全是1的Tensor在第一軸做加總,第一軸消失:
```
x=tf.ones((4,2,3))
tf.math.reduce_sum(x,axis=0)
```
```
因tensor shape為(4,2,3),則加總後變成數值全為4且shape為(2,3)的tensor:
[[4., 4., 4.],
[4., 4., 4.]]
```
2. 多tensor的operation在指定軸下,會列舉該軸在多個tensor所有對應項目來計算,並得到一個該軸仍保持長度的結果。
> e.g.將兩個Tensor指定第一軸做矩陣乘法,操作後除第一軸外,期他軸數量改變:
```
x=tf.ones((4,2,3))
y=tf.ones((4,3,2))
x@y
```
```
因tensor shape為(4,2,3)及(4,3,2),矩陣相乘後變成
數值全為4且shape為(2,3)的tensor:
[[[3., 3.],
[3., 3.]],
[[3., 3.],
[3., 3.]],
[[3., 3.],
[3., 3.]],
[[3., 3.],
[3., 3.]]]
```