NumPyの使い方

#1 はじめに
NumPyは配列計算を行うライブラリです。ベクトル、行列演算を行うことができます。
ここでは、NumPyのloadtxt関数の使い方について説明します。



#2 環境
VMware Workstation 15 Playerで作成した仮想マシン(1台)を使用しました。
CentOSの版数は下記のとおりです。

```console:CentOSの版数
[root@server ~]# cat /etc/redhat-release
CentOS Linux release 8.3.2011
```

カーネルの版数は下記のとおりです。

```console:カーネルの版数
[root@server ~]# uname -r
4.18.0-240.el8.x86_64
```

#3 Anacondaのインストール
ここでは、Anacondaをインストールして、Anacondaの仮想環境で各種動作確認をしました。
[Docker](https://qiita.com/hana_shin/items/392bd01be6aff9fc1dd4)や[Kubernetes](https://qiita.com/hana_shin/items/ef1a20239001ac83a78d)のように、既存の環境に影響を与えることなくライブラリのインストール、
削除ができるので便利だと思います。
Anacondaのインストール方法は、[Anacondaのインストール方法](https://qiita.com/hana_shin/items/a65d686d0e611884cef4)を参照してください。


#4 事前準備
Anacondaの仮想環境で、テスト用のcsvファイルを作成します。
1列目が月、2列目が月の最高気温を表しています。

```console:月別の最高気温
(base) [root@server ~]# cat data.csv
1,10
2,11
3,15
4,18
5,20
6,25
7,32
8,35
9,30
10,25
11,20
12,10
```

#5 loadtxt関数の使い方
loadtxt関数のパラメータは、以下のとおりです。

```console:構文
numpy.loadtxt(fname, dtype=<class 'float'>, comments='#', delimiter=None, converters=None, skiprows=0, usecols=None, unpack=False, ndmin=0, encoding='bytes', max_rows=None, *, like=None)
```

##5.1 delimiterの使い方
`delimiter`でデリミッターを指定します。デフォルトは空白です。
ここで使用するテスト用ファイルは、デリミッターとして`,`を使用しているので、
`delimiter`には、`,`を指定します。

```console:サンプルコード
(base) [root@server ~]# cat tp.py
import numpy as np

data = np.loadtxt('data.csv',delimiter=',')
print(data)
```


```console:実行結果
(base) [root@server ~]# python3 tp.py
[[ 1. 10.]
 [ 2. 11.]
 [ 3. 15.]
 [ 4. 18.]
 [ 5. 20.]
 [ 6. 25.]
 [ 7. 32.]
 [ 8. 35.]
 [ 9. 30.]
 [10. 25.]
 [11. 20.]
 [12. 10.]]
```

##5.2 dtypeの使い方
`dtype`は、データ型を指定します。
デフォルトは`float`型です。ここでは、配列に格納するデータを`int`型に変換してみます。

```console:サンプルコード
(base) [root@server ~]# cat tp.py
import numpy as np

data = np.loadtxt('data.csv',delimiter=',',dtype=int)
print(data)
```

配列に格納された数が`int`型になっていることがわかります。

```console:実行結果
(base) [root@server ~]# python3 tp.py
[[ 1 10]
 [ 2 11]
 [ 3 15]
 [ 4 18]
 [ 5 20]
 [ 6 25]
 [ 7 32]
 [ 8 35]
 [ 9 30]
 [10 25]
 [11 20]
 [12 10]]
```


##5.3 skiprowsの使い方
`skiprows`は、`skiprows`で指定する行数を読み飛ばすパラメータです。
ここでは、最初の5行を読み飛ばしてみます。

```console:サンプルコード
(base) [root@server ~]# cat tp.py
import numpy as np

data = np.loadtxt('data.csv',delimiter=',',skiprows=5)
print(data)
```

最初の5行が読み飛ばされていることがわかります。

```console:実行結果
(base) [root@server ~]# python3 tp.py
[[ 6. 25.]
 [ 7. 32.]
 [ 8. 35.]
 [ 9. 30.]
 [10. 25.]
 [11. 20.]
 [12. 10.]]
```


##5.4 usecolsの使い方
`usecols`は、使用する列を指定するパラメータです。

0列目(月)を表示するスクリプトを作成します。

```console:サンプルコード
(base) [root@server ~]# cat tp.py
import numpy as np

data = np.loadtxt('data.csv',delimiter=',',usecols=(0))
print(data)
```

0列目の月の列だけが表示されたことがわかります。

```console:実行結果
(base) [root@server ~]# python3 tp.py
[ 1.  2.  3.  4.  5.  6.  7.  8.  9. 10. 11. 12.]
```

次に、0列名、1列目を表示するスクリプトを作成します。

```console:サンプルコード
(base) [root@server ~]# cat tp.py
import numpy as np

data = np.loadtxt('data.csv',delimiter=',',usecols=(0,1))
print(data)
```

```console:実行結果
(base) [root@server ~]# python3 tp.py
[[ 1. 10.]
 [ 2. 11.]
 [ 3. 15.]
 [ 4. 18.]
 [ 5. 20.]
 [ 6. 25.]
 [ 7. 32.]
 [ 8. 35.]
 [ 9. 30.]
 [10. 25.]
 [11. 20.]
 [12. 10.]]
```


##5.5 unpackの使い方
`unpack`は、配列を転置するためのパラメータです。
転置とは行と列を入れかえることです。
`unpack=True`とすることで、転置が行われます。

```console:サンプルコード
(base) [root@server ~]# cat tp.py
import numpy as np

data = np.loadtxt('data.csv', delimiter=',', unpack=True)
print(data)
```

デフォルトだと12行2列の行列ですが、`unpack=True`と指定したことで
2行12列に変換されたことがわかります。

```console:実行結果
(base) [root@server ~]# python3 tp.py
[[ 1.  2.  3.  4.  5.  6.  7.  8.  9. 10. 11. 12.]
 [10. 11. 15. 18. 20. 25. 32. 35. 30. 25. 20. 10.]]
```

#6 Matplotlibによるグラフ化


##6.1 棒グラフの作成方法
Matplotlibを使って、月の最高気温のデータを棒グラフで表してみます。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146813/40824644-2559-2a17-cb3c-e56e6881e18b.png)


サンプルコードは、以下のとおりです。

```console:サンプルコード
(base) [root@server ~]# cat tp.py
import numpy as np
import matplotlib.pyplot as plt

month, temp = np.loadtxt('data.csv', delimiter=',', unpack=True)
fig = plt.figure()
ax = fig.add_subplot(1,1,1)
ax.bar(month, temp)
```

サンプルコードが読み込むデータは以下のとおりです。

```console:月の最高気温のデータ
(base) [root@server ~]# cat data.csv
1,10
2,11
3,15
4,18
5,20
6,25
7,32
8,35
9,30
10,25
11,20
12,10
```

##6.2 積み上げ棒グラフの作成方法
名前とテスト（国語、算数、理科）の合計得点を積み上げ棒グラフで表示してみます。

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146813/e208fc6b-5eac-2907-b888-e198785c0b5d.png)

ソースコードは以下になります。

```console:サンプルコード
import numpy as np
import matplotlib.pyplot as plt
 
name = ['kato', 'suzuki', 'tanaka']
kokugo = np.array([90, 40, 10])
sansu  = np.array([10, 20, 90])
rika   = np.array([30, 30, 80])
   
fig = plt.figure()
ax = fig.add_subplot(1,1,1)
ax.bar(name, kokugo, label='kokugo')
ax.bar(name, sansu, bottom = kokugo, label='sansu')
ax.bar(name, rika, bottom = kokugo + sansu, label='rika')

ax.legend()
plt.show()
```


#Z 参考情報
##Z.1 ネット情報
[NumPy](https://numpy.org/)
[numpy.loadtxt](https://numpy.org/doc/stable/reference/generated/numpy.loadtxt.html)
[Using NumPy's loadtxt method](https://scipython.com/book/chapter-6-numpy/examples/using-numpys-loadtxt-method/)
[PandasとNumPyの違いと使い分け方](https://deepage.net/features/pandas-numpy.html)

##Z.2 参考図書
[Pythonコードレシピ集](https://www.amazon.co.jp/Python%E3%82%B3%E3%83%BC%E3%83%89%E3%83%AC%E3%82%B7%E3%83%94%E9%9B%86-%E9%BB%92%E4%BD%8F-%E6%95%AC%E4%B9%8B/dp/4297118610/ref=sr_1_2_sspa?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=1K2MDG1X048R8&dchild=1&keywords=python+%E3%82%B3%E3%83%BC%E3%83%89%E3%83%AC%E3%82%B7%E3%83%94%E9%9B%86&qid=1634474486&sprefix=python+%E3%82%B3%E3%83%BC%E3%83%89%2Caps%2C256&sr=8-2-spons&psc=1&spLa=ZW5jcnlwdGVkUXVhbGlmaWVyPUEzUUMwQjExNVI0WTNCJmVuY3J5cHRlZElkPUEwMDQ2MzAzMTNPMU1RWVc0NDM1OSZlbmNyeXB0ZWRBZElkPUExTEJJU0hFUlZWV1gxJndpZGdldE5hbWU9c3BfYXRmJmFjdGlvbj1jbGlja1JlZGlyZWN0JmRvTm90TG9nQ2xpY2s9dHJ1ZQ==)