python 機械学習　＃2　NumPy



# NumPyとは
NumPyとはPythonで科学技術計算をする際のツールの一つであって高度な計算などをしたい時によく使われます。例えば、多次元配列機能や線形代数などに使われます。またPythonの計算は他のプログラミング言語よりも計算が遅いので計算処理を早くしたい時に使います。

## NumPyとPythonの計算処理の時間の違い

```py
# NumPyをnpとしてインポート
import numpy as np
# pythonのtime
import time 
# aに標準正規乱数100000個を格納する
a = np.random.randn(100000)
# スタートの時間
start = time.time()
# npでaの和を求めるのを1000回繰り返す
for _ in range(1000):
    sum_a = np.sum(a)
end = time.time()
print("Using NumPy", end-start)
b = list(a)
start = time.time()
# pythonでaの和を求めるのを1000回繰り返す
for _ in range(1000):
    sum_b = sum(b)
end = time.time()
print("Python", end-start)
```
実行結果

```py
Using NumPy 0.0279238224029541
Python 4.164802074432373
```
これを見てくれればわかるようにものすごい計算速度が違うことがわかります。このようにNumPyは高度な難しい計算をするだけでなく計算速度も早くなります。

# NumPyを使ってみる
##numpyをインポート
```py
import numpy as np
```
##numpyで配列を作成する

```py
a = np.array([1, 2, 3])
```
で作成できる。ここで注意して欲しいのはあくまでNumPyの配列であるということだ。ですのでPythonのコードで計算等をしたい時は一度list()を使ってリスト化する必要があるので注意してください（通常は numpy で押し通せばよいだけです）

##arangeでの配列の作成
```py
np.arange(10)
#実行結果
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
```
arangeはpythonでいうrangeみたいなものである。またこれを２つ間隔を開けたいな！（2つとばし）などと思ったらnp.arange(0, 10, 2)でできます。
##linspace
linspaceはある決まった範囲での数字の配列をある数で分ける時に使う。要は等差数列をすると考えてください。

```py
np.linspace(start, end)
```
詳しく説明していくとこれはstartに記した値からendで示した値までの範囲をある決まった範囲でうまく等しく足されるようにやっていくものです。デフォルトだと50またぎで分割されていきます。
例えば、、、

```py
np.linspace(0, 10)
#実行結果
array([  0.        ,   0.20408163,   0.40816327, 0.6122449 ,
         0.81632653,   1.02040816,   1.2244898 ,   1.42857143,
         1.63265306,   1.83673469,   2.04081633,   2.24489796,
         2.44897959,   2.65306122,   2.85714286,   3.06122449,
         3.26530612,   3.46938776,   3.67346939,   3.87755102,
         4.08163265,   4.28571429,   4.48979592,   4.69387755,
         4.89795918,   5.10204082,   5.30612245,   5.51020408,
         5.71428571,   5.91836735,   6.12244898,   6.32653061,
         6.53061224,   6.73469388,   6.93877551,   7.14285714,
         7.34693878,   7.55102041,   7.75510204,   7.95918367,
         8.16326531,   8.36734694,   8.57142857,   8.7755102 ,
         8.97959184,   9.18367347,   9.3877551 ,   9.59183673,
         9.79591837,  10.        ])
```
詳しく説明していくと、最初は0と0.20408163ですよね？これと同じ数をどんどん足していくような感じです。ですが１００％うまく分けられるわけではないので多少の誤差が生まれます。では先ほどのものを３つほどやっていきます。

```py
0 + 0.20408163
0.20408163 + 0.20408163
0.40816326（ちょっと誤差あり） + 0.20408163
0.6122449
```
このようにうまく分割仕組みになっていきます。ではこの50個要素を作るというのを変更していくのはどうしていくのかというとnp.linspace(0, 10, 10)とやるとうまく10等分されるようにできます。
## numpyの四則演算

```py
#足し算
a + 2
#実行結果
array([3, 4, 5])
#引き算
a - 1
# 実行結果
array([0, 1, 2])
#掛け算
a * 2
#実行結果
array([2, 4, 6])
#割り算
a / 2
#実行結果
array([0.5, 1, 1.5])
```
##shapeを使う
shapeを使うと配列の中身がどうなっているのかをわかるようになります。例をあげると

```
b = np.array([[1, 2, 3], [4, 5, 6]])
b.shape
#実行結果
(2, 3)
```
詳しく説明していきます。[1, 2, 3]をnumber_1として[4, 5, 6]をnumber_2とすると

```py 
b = np.array([number_1], [number_2])
```
というふうになる。これは２つの配列があるようになりますよね？ですから２となる。そして配列の中には３つの要素がありますよね？そうなるので

```py
b.shape
(2, 3)
```
というふうになる。

##sum
これは要素全てを足しすということです。

```py
np.sum(a)
6
```
というようになる。またこれには引数axisというものがある。これは軸を指定するという意味である。axisはデフォルトが０であるためsumの場合全てが足されます。axisが０いわば横にどんどん広がっていくような感じになっていきます。（参照：https://deepage.net/features/numpy-axis.html）

![numpy-shape-2d.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406024/e3698103-cf0d-9f83-47cc-8c4d508115cb.jpeg)

このようになるので一回横まで足したら処理が終わるので、この場合は

```py
c = np.array([[0, 1], [2, 3], [4, 5]])
np.sum(c, axis=1)
#実行結果
array([1, 5, 9])
```
というようになります。

##reshape
これはshapeの置き換えバージョンだと思ってください。例えば

```py
b = np.array([[1, 2, 3], [4, 5, 6]])
b.shape
#実行結果
(2, 3)
#これをshape(3, 2)にしたい時
b.reshape(3, 2)
#実行結果
array([[1, 2], [3, 4], [5, 6]])
```
という風に簡単に行数と列数を変更することができる。

#transpose
これは実行して考えてみよう

```py
a = np.arange(12).reshape(3,4)
a
#実行結果
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
a.transpose()
#実行結果
array([[ 0,  4,  8],
       [ 1,  5,  9],
       [ 2,  6, 10],
       [ 3,  7, 11]])
```
このように行と列を入れ替えた配列を作る。



間違えているところがありましたらおしらせください！！

最後まで閲覧してくださりありがとうございました！
これからについて
自分は今高校二年生です。ですので受験を意識した勉強をしなくてはいけないので毎週月曜日に更新していきたいと思います。


参考になったサイト、本

Website: https://deepage.net/features/numpy/
本：　Pythonで始める機械学習