Numpy入門

#Numpy入門
この記事では、numpyの基礎から示しつつ、最後には線形代数の難所である線形写像についても説明して行きたいと思います。

##numpyとは
numpyは、数値計算用ライブラリィで、ベクトルや行列を表現できるのが強みのライブラリィです。
それ以外にも、*sin* *exp*といった計算に必要な関数も用意されています。

##numpyのインポート
```
import numpy as np
```
意味としては、numpyを取り込んで、npという名前で使用しますといった感じです。npとするのは慣例なので気にしないで大丈夫です。

##ベクトル・行列の作り方
np.array()で指定の行列を作ることができます。
###ベクトル
大きさと方向を持つ量で、要素の位置が方向を表し、数字が大きさを表します。
下の例で、これが3次元xyz系だとすると、x方向にaの大きを持ち、y方向にbの大きさを持ち、z方向にcの大きさを持つようなものになる。

```math
\begin{bmatrix}
a  \
b  \
c 
\end{bmatrix}
```

ベクトルには行ベクトルと、列ベクトルがあり、書き方も違ってきます。


####行ベクトル
要素が横に並べられているベクトル

```math
\begin{bmatrix}
1\
2
\end{bmatrix}
```
```
np.array([1,2])
```

####列ベクトル
要素が縦に並べられているベクトル

```math
\begin{bmatrix}
1\\
2
\end{bmatrix}
```

```
np.array([[1],[2]])
```
基本ベクトルは、列ベクトルで表して、行ベクトルは、列ベクトルの転置として扱われます。(転置はのちに説明します。)

###行列
複数の行と列で構成されているもので、縦方向を列、横方向を行といい、行×列の順番で表されます。

```math
\begin{bmatrix}
1&2\\
3&4
\end{bmatrix}
```
```
np.array([[1,2],[3,4]])
```

##四則演算・内積
行列の和と差は同じ大きさの行列、もしくはスカラーとしかできません。
###和と差
和と差の場合は、+-で行うことができます。
####スカラーと行列
要素すべてにスカラーの値が足される（引かれる）ことになります。

```math
\begin{bmatrix}
1&2\\
3&4
\end{bmatrix}+1=
\begin{bmatrix}
2&3\\
4&5
\end{bmatrix}
```
```
np.array([[1,2],[3,4]]) +1
```

>array([[2, 3],
           [4, 5]])

####行列と行列
行列どうしの場合は同じ位置に属する要素ごとが足されます。

```math
\begin{bmatrix}
1&2\\
3&4
\end{bmatrix}+
\begin{bmatrix}
5&6\\
7&8
\end{bmatrix}=
\begin{bmatrix}
6&8\\
10&12
\end{bmatrix}
```
```
np.array([[1,2],[3,4]])+np.array([[5,6],[7,8]])
```
>array([[ 6,  8],
       [10, 12]])

###積
####スカラー倍の時（スカラー×行列）
この時は、基本的に和と差と同じように、すべての要素がスカラー値かかります。

```math
3\times\begin{bmatrix}
1&2\\
3&4
\end{bmatrix}=
\begin{bmatrix}
3&6\\
9&12
\end{bmatrix}
```
*でスカラー倍は行うことができます。

```
3*np.array([[1,2],[3,4]])
```
>array([[ 3,  6],
       [ 9, 12]])

####アダマール積
同じ大きさの行列の場合は、和と差のように、要素ごとの掛け算をすることができます。これをアダマール積といいます。

```math
\begin{bmatrix}
1&2\\
3&4
\end{bmatrix}\otimes\begin{bmatrix}
1&2\\
3&4
\end{bmatrix}=
\begin{bmatrix}
1&4\\
9&16
\end{bmatrix}
```

```
np.array([[1,2],[3,4]])*np.array([[1,2],[3,4]])
```
>array([[ 1,  4],
       [ 9, 16]])

####内積と行列積
内積は、行列積のベクトル版と思っていいただけたら大丈夫です。
行列積を行うには、左側の列数と、右側の行数が同じでなければなりません。
それによってできる行列は、左辺の行数と右辺の列数を持つものができます。

```math
\begin{bmatrix}
1&2\\
3&4\\
5&6
\end{bmatrix}
\begin{bmatrix}
1&2&3\\
4&5&6
\end{bmatrix}
=\begin{bmatrix}
9&12&15\\
19&26&33\\
29&40&51
\end{bmatrix}
```

3行2列と2行3列の行列積は3行3列になっているのがわかります。
np.dot(A,B)のように書きます

```
np.dot(np.array([[1,2],[3,4],[5,6]]),np.array([[1,2,3],[4,5,6]]))
```

>array([[ 9, 12, 15],
       [19, 26, 33],
       [29, 40, 51]])

##転置
転置は要素の行と列を入れ替える操作のことを言います。行列の［］の右上にtと書きます。(左に書いてある教科書もあります)

```math
\begin{bmatrix}
1&2\\
3&4
\end{bmatrix}^t = \begin{bmatrix}
1&3\\
2&4
\end{bmatrix}
```
.Tを行列の後につけることで転置をすることができます。

```
np.array([[1,2],[3,4]]).T
```
>array([[1, 3],
       [2, 4]])

##逆行列
逆行列とは、行列Aともう1個の行列で行列積をすると単位行列が生まれるような行列のことである。
これから必要になる知識をまとめておきます。

###単位行列
対角成分しか要素をもっておらず要素がすべて1の行列。

```math
\begin{bmatrix}
1&0\\
0&1
\end{bmatrix}
```
np.eye()で作ることができます。

```
np.eye(2)
```
>array([[1., 0.],
       [0., 1.]])


###正方行列:
行と列の数が同じ行列

```math
\begin{bmatrix}
1&2\\
3&4
\end{bmatrix}
```
この場合2×2行列で正則

###行列式
正方行列の場合、その行列をスカラーで表すことができ、行列式という。行列式が0で場合、その行列は正則行列呼ばれます。解き方色々あり、余因子展開はやり方を覚えてしまえばどんなものでも解くことができます。

```math
\begin{vmatrix}
1 & 2 \\
3 & 4
\end{vmatrix}
=-2
```
np.linalg.det()のようにプログラミングできます。

```
np.linalg.det([[1,2],[3,4]])
```
>-2.0000000000000004

###逆行列
逆行列は、元の行列の左上に-1がつけられます。
逆行列を求めるには、その行列が正則である必要があります。

```math
\begin{bmatrix}
1 & 2 \\
3 & 4
\end{bmatrix}^{-1}=\begin{bmatrix}
-2 & 1 \\
\frac{3}{2} & \frac{-1}{2}
\end{bmatrix}
```
np.linalg.inv()で逆行列を求めることができます。

```
np.linalg.inv([[1,2],[3,4]])
```
>array([[-2. ,  1. ],
       [ 1.5, -0.5]])


##線形写像
ここ内容は難しいのでイメージが付きやすいように説明いたします。

線形空間VからV'、Vの要素を表現行列を用いて、V'で写せることを言います。
この表現は100％正しいわけではありませんが、わかりやすく表現いたしました。しかし、これだでもイメージつきにくいいと思います。y = 3xで言うとxの空間の値を3倍すると、yの空間のある値になるのと同じようなものです。


しっかりとした定義はx,y∉V、t∉R(実数)の時,fに次のような性質があるときをfを線形写像といいます

```math
f(\boldsymbol{x},\boldsymbol{y}) = f(\boldsymbol{x}) + f(\boldsymbol{y})\\
f(t\boldsymbol{x}) = tf(\boldsymbol{x})
```
y = f(x) = 3xとするとfが線形写像、3が表現行列,xがVの要素、yがV'の要素となる。次に例を示す。
表現行列A

```math
A =
\begin{bmatrix}
1&0&1\\
0&1&1
\end{bmatrix}
```

Vの要素x

```math
\boldsymbol{x} = 
\begin{bmatrix}
1\\
1\\
1
\end{bmatrix}
```

V'の要素x'

```math
A\boldsymbol{x} =
\begin{bmatrix}
1&0&1\\
0&1&1
\end{bmatrix}\begin{bmatrix}
1\\
1\\
1
\end{bmatrix}
=\begin{bmatrix}
2\\
2\\
\end{bmatrix}
```
このようにVの(1,1,1)の点が、V'の(2,2)に変換された。

```
np.dot(np.array([[1,0,1],[0,1,1]]),np.array([[1],[1],[1]]))
```
>array([[2],
       [2]])

線形写像より線形変換という言葉を聞いたことがある人もいるかもしれない。線形変換は同じ実数空間上での変換をいう。例えば、先ほどの問題は3次元空間から2次元空間への写像より、線形変換ではない。
線形変換の例を示す。

```math
A\boldsymbol{x} =
\begin{bmatrix}
1&0&1\\
0&1&1\\
1&1&1
\end{bmatrix}\begin{bmatrix}
1\\
1\\
1
\end{bmatrix}
=\begin{bmatrix}
2\\
2\\
3
\end{bmatrix}
```
このようにVの(1,1,1)がV'の(2,2,3)に変換されたという。

```
np.dot(np.array([[1,0,1],[0,1,1],[1,1,1]]),np.array([[1],[1],[1]]))
```
>array([[2],
       [2],
       [3]])