Numpyについて

## Numpyについて
今回はNumpyについて学習したのでまとめてみました。
要点だけまとめて記述していきます。

## Numpyとは
まずNumpyの定義として、
「Pythonにおいて数値計算を効率的に行うための拡張モジュール」
となります。
特に線形代数やベクトルや行列の演算を行うライブラリです。

## インストール
numpyのインストール方法。

```python:qiita.py
$ pip install numpy
```
## np.array()
numpyで配列を作るのにはarray()関数を使います。

```python:qiita.py
$ x = np.array([1, 2, 3])
# array([1, 2, 3])
```

## 行列、次元数を確認
行列のサイズを確認する時は、shapeを使います。

```python:qiita.py
$ x.shape
# (3,)
# これでは1次元配列になっているので、
$ x = np.array([[1, 2, 3]])
# このように書き換えてshapeを使うと、
$ x.shape
# (1, 3)
# 2次元配列になり1行3列と出力される
$ x = np.array([
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
])
# (3, 3)
```

reshapeは行と列の変更ができる

```python:qiita.py
$ x = np.array([
    [1, 2, 3],
    [4, 5, 6]
])
# array([[1, 2, 3],[4, 5, 6]
])
$ x.reshape(3, 2)
# array([[1, 2],[3, 4],[5, 6]])
```

次元数を確認する時は、ndimを使います。

```python:qiita.py
$ x.ndim
# 1次元配列
$ x = np.array([[1, 2, 3]])
# 2次元配列
```

## np.zeros()
zerosは全ての要素を0に変更することができる。

```python:qiita.py
$ np.zeros((2, 2))
# array([[0., 0.],[0., 0.]])
$ x = np.array([[1, 2], [3, 4], [5, 6]) 
np.zeros_like(x)
# array([[0, 0],[0, 0],[0, 0]])
```

## np.ones()
onesもzeros同様に要素を1に変更することができる。

```python:qiita.py
$ np.oness((2, 2))
# array([[1, 1],[1, 1]])
$ x = np.array([[1, 2], [3, 4], [5, 6]) 
np.zeros_like(x)
# array([[1, 1],[1, 1],[1, 1]])
```

## 平均
numpyでは平均を出すことも可能です。
meanを使うと要素の平均を出力できます。

```python:qiita.py
$ x = np.array([[1, 2], [3, 4], [5, 6]) 
np.mean(x)
# 3.5
# mean(axis=1)で行(横)の平均を取ることができる
$ x.mean(axis=1)
# array([1.5, 3.5, 5.5])
```

## 分散
分散というのは一般的にはデータのばらつき度合いを示すために使われる指標です。
平均との偏差の2乗を平均したものが分散になります。

```python:qiita.py
$ x = np.array([
    [1, 2],
    [3, 4],
    [5, 6]
])
np.var(x)
# 2.9166666666666665
```

## 標準偏差(std)
標準偏差は、各データの値と平均値の差(偏差)。

```python:qiita.py
$ x = np.array([
    [1, 2],
    [3, 4],
    [5, 6]
])
x.std()
# 1.707825127659933
```

## 最大値、最小値
最大値はmax、最小値minで表現します。

```python:qiita.py
$ x = np.array([
    [1, 2],
    [3, 4],
    [5, 6]
])
x.max()
# 6
x.min()
# 1

# 最大値の要素番号取得
$ np.argmax(x)
# 5

# 最小値の要素番号取得
$ np.argmax(x)
# 0
```

## 転置
行と列の位置を変更することができる。

```python:qiita.py
$ x = np.array([
    [1, 2],
    [3, 4],
    [5, 6]
])
x.T
# array([[1, 3, 5], [2, 4, 6]])
```

## 四則演算(足し算、引き算、行列積、アダマール積)
足し算

```python:qiita.py
$ a = np.array([[1, 3], [-2, 4]])
b = np.array([[2, -1], [3, 0]])
a + b
# array([[3, 2],[1, 4]])
```

引き算

```python:qiita.py
$ a = np.array([[1, 3], [-2, 4]])
b = np.array([[2, -1], [3, 0]])
a - b
# array([[-1,  4],[-5,  4]]) 
```

行列積

```python:qiita.py
$ a = np.array([[1, 3], [-2, 4]])
b = np.array([[2, -1], [3, 0]])
a @ b
# もしくは
a.dot(b)
# array([[11, -1],[ 8,  2]])  
```


アダマール積

```python:qiita.py
$ a = np.array([[1, 3], [-2, 4]])
b = np.array([[2, -1], [3, 0]])
a * b 
# array([[ 2, -3],[-6,  0]])
```

## 条件による選択
不等号によって、TrueとFalseの判定をする。

```python:qiita.py
$ x = np.array([
    [1, 2],
    [3, 4],
    [5, 6]
])
x > 3
# array([[False, False],[False,  True],[ True,  True]])

# Trueを取得したい時
$ x[x > 3]
# array([4, 5, 6])

# Falseを取得したい時
$ x[x < 3]
# array([1, 2])
```

## 1次元に変換
ravel()は1次元配列に変換します。

```python:qiita.py
$ x = np.array([
    [1, 2],
    [3, 4],
    [5, 6]
])
x.ravel()
# array([1, 2, 3, 4, 5, 6])
```

## linspaceとarange
linspaceは要素数を指定して等差数列を生成する。

```python:qiita.py
$ np.linspace(0, 1, 11)
# array([0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1. ])
```

arangeは間隔を指定して等差数列を生成する。

```python:qiita.py
$ np.arange(-5.0, 5.0, 0.5)
# array([-5.0, -4.5, -4.0, -3.5, -3.0, -2.5, -2.0, -1.5, -1.0, -0.5, 0.0, 0.5, 1.0,  1.5,  2.0,  2.5,  3.0,  3.5,  4.0,  4.5])
```

## 乱数の生成
ランダムに値を生成。
randnは標準偏差部分(平均0)で-10~10にて出力。

```python:qiita.py
$ np.random.randn(10)
# array([-0.475776  ,  1.44073112, -1.14907568,  0.80571455,  1.75610703,0.97297991, -1.55111911,  0.19114348,  1.60477607, -1.42002593])
```

乱数によって生成した値をseed()によって固定することができる。

```python:qiita.py
$ np.random.seed(0)
# array([-0.475776])
```

randによって0~1の連続する乱数の生成する。

```python:qiita.py
$ np.random.rand(10)
# array([0.79172504, 0.52889492, 0.56804456, 0.92559664, 0.07103606, 0.0871293 , 0.0202184 , 0.83261985, 0.77815675, 0.87001215])
```

randintによって引数で指定した値を複数取得する。

```python:qiita.py
# 今回は0~100の値のうち10個ランダムで取得
$ np.random.randint(0, 100, 10)
# array([82, 46, 99, 20, 81, 50, 27, 14, 41, 58])
```

shuffleで文字列の位置をランダムに取得できる

```python:qiita.py
$ x = ['A', 'B', 'C', 'D', 'E']
np.random.shuffle(x)
# ['E', 'D', 'C', 'B', 'A']
```

## np.eye()
個人で解説するよりわかりやすいサイトがあったので貼っておきます。
[NumPyのeye関数で単位行列を作成する方法](https://www.headboost.jp/numpy-eye/)

```python:qiita.py
$ x = np.eye(5)
#array([[1., 0., 0., 0., 0.],
#      [0., 1., 0., 0., 0.],
#       [0., 0., 1., 0., 0.],
#       [0., 0., 0., 1., 0.],
#      [0., 0., 0., 0., 1.]])
```

## intの挙動(追記)
intの挙動範囲

int8 -128 ~ 127
int16 -32768 ~ -2147483647
int32 -2,147,483,648 ～ 2,147,483,647
int64 -9,223,372,036,854,775,808 ～ 9,223,372,036,854,775,807
uint8 0 ～ 255
uint16 0 ～ 65,535
uint32 0 ～ 4,294,967,295
uint64 0 ～ 18,446,744,073,709, 551,615

## 最後に
今回Numpyについて以上です。
Numpyについての理解と練習問題をどんどん解いて理解を深めていきます。
次回pandasについて投稿していきます！！