【Python】Numpyのサンプル

# 環境
Python3

# Numpyとは
- Pythonで利用可能な数値演算用ライブラリです。
- 多次元配列の数値計算や配列操作を行う際に便利です。
- [修正BSDライセンス](https://ja.wikipedia.org/wiki/BSD%E3%83%A9%E3%82%A4%E3%82%BB%E3%83%B3%E3%82%B9#%E4%BF%AE%E6%AD%A3BSD%E3%83%A9%E3%82%A4%E3%82%BB%E3%83%B3%E3%82%B9%E3%83%BB%E4%B8%89%E6%9D%A1%E9%A0%85BSD%E3%83%A9%E3%82%A4%E3%82%BB%E3%83%B3%E3%82%B9)

# 配列

- 配列の操作が以下のように直感的に実装できます。

```py
# numpyライブラリをインポート
import numpy as np

# 整数型の配列を用意
arr_int32 = np.array([100, 200, 300, 400, 500], dtype=np.int32)
print(arr_int32)

# 浮動小数点型の配列を用意
arr_float = np.array([0.1, 0.2, 0.3, 0.4, 0.5], dtype=np.float64)
print(arr_float)

# 配列通しの計算を + で表現できます。
arr_sum = arr_int32 + arr_float
print(arr_sum)

=>
[100 200 300 400 500]
[0.1 0.2 0.3 0.4 0.5]
[100.1 200.2 300.3 400.4 500.5]
```
- Numpyライブラリのインポート「import numpy as np」は慣例となっています。as np2 でも、as np3 でも動作しますが、その慣例も文化と思って、尊重しています。
- 上記のように配列の要素通しの計算を簡単に記載できますが、配列の要素数が一致していないと以下のようにエラーとなります。

```py
import numpy as np
arr_int32 = np.array([100, 200, 300, 400, 500], dtype=np.int32)
print(arr_int32)

arr_float = np.array([0.1, 0.2], dtype=np.float64)
print(arr_float)

arr_sum = arr_int32 + arr_float
print(arr_sum)

=> 
[100 200 300 400 500]
[0.1 0.2]
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-25-a384ac640ecb> in <module>()
      6 print(arr_float)
      7 
----> 8 arr_sum = arr_int32 + arr_float
      9 print(arr_sum)

ValueError: operands could not be broadcast together with shapes (5,) (2,) 
```

# 多次元配列
- 前述の配列と同じく配列の操作が簡単に行えます。

```py
import numpy as np
arr1 = np.array([[1, 2],[100, 200]])
print(arr1)

arr2 = np.array([[3, 4],[300, 400]])
print(arr2)

arr_sum = arr1 + arr2
print(arr_sum)

=>

[[  1   2]
 [100 200]]
[[  3   4]
 [300 400]]
[[  4   6]
 [400 600]]
```

# 最小値、最大値などの求め方

```py
import numpy as np

#1～100までの連番を格納
arr = range(1, 100+1)

#最小値
print(np.min(arr))

#最大値
print(np.max(arr))

#平均
print(np.mean(arr))

#標準偏差
print(np.std(arr))

#分散
print(np.var(arr))

#合計値
print(np.sum(arr))

=>
1
100
50.5
28.86607004772212
833.25
5050
```

# 乱数の配列を生成

- Numpyで乱数を生成することも出来ます。
- 可視化してみました。

```py
%matplotlib inline
from matplotlib import pyplot as plt

np.random.seed(10)
arr_ramdom = np.random.randint(1, 101, 100)

plt.hist(arr_ramdom)
plt.show()
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/235774/54484290-f60f-1de1-af6b-716328982183.png)


# ソート処理
- np.sort()で配列のソートが行えます。逆順でソートする際は、 [::-1] を指定します。

```py
np.random.seed(10)
arr_random = np.random.randint(1, 101, 10)

#昇順
print(np.sort(arr_random))

#逆順
print(np.sort(arr_random) [::-1] )

=>
[ 1  9 10 16 29 30 65 74 90 94]
[94 90 74 65 30 29 16 10  9  1]
```

# 行列を指定してのソート処理

- ソート時に行列を指定する際は、axis で指定します。(0：行、1：列)
- 昇順、逆順の指定は、上記、一次元配列と同様に [::-1] を指定した場合、逆順でソートします。列を逆順でソート時は、[:, ::-1] を指定します。

```py
np.random.seed(1)
#行列(3×4)
arr_m = np.random.randint(1, 10+1, [3, 4])

print("【0.ソート前】")
print(arr_m)

print("【1.行を昇順でソート】")
print(np.sort(arr_m, axis=0))

print("【2.行を逆順でソート】")
print(np.sort(arr_m, axis=0)[::-1])


print("【3.列を昇順でソート】")
print(np.sort(arr_m, axis=1))

print("【4.列を逆順でソート】")
print(np.sort(arr_m, axis=1)[:, ::-1])
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/235774/387c772b-f621-7234-0924-703f3e5c2cbd.png)