Python NumPy 使い方

``` Python
import numpy as np
```
以下numpyをnpと表記

# NumPyの主な型
np.array関数でNumPy配列を作る際、引数dtypeで要素のデータ型を指定する
指定しなかった場合は、引数で指定されたデータ内容から自動で指定される
|型|説明|
|---|---|
|int#|#ビットの整数 #には8、16、32、64などを指定|
|float#|#ビットの浮動小数点数 #には8、16、32、64などを指定|
|bool|真偽値|
|string_|固定長の文字列|
|object|Pythonオブジェクト(インスタンス)|

``` Python
li = np.array([1,2,3], dtype="int16")
```

# NumPy配列のプロパティ
|プロパティ|説明|例|
|---|---|---|
|dtype|要素の型||
|size|要素の数||
|nbytes|メモリ消費量(バイト)||
|ndim|次元数|1次元、2次元|
|shape|行数、列数|(2,3)は2行、3列の配列|
``` Python
li=np.array([[1,2,3],[4,5,6]],dtype="int16")
print(li) # [[1 2 3]
          #  [4 5 6]]
print(li.dtype) # int16
print(li.size) # 6
print(li.nbytes) # 12
print(li.ndim) # 2
print(li.shape) # (2, 3)
```

# NumPy配列の要素取得
``` Python
li=np.array([[1,2,3], [4,5,6]], dtype="int16")
print(li[0, 1]) # 2
print(li[1, 2]) # 6
print(li[0, 1:]) # [2 3]
print(li[0, :2]) # [1 2]
print(li[0, :]) # [1 2 3]
```

# NumPy配列の行数列数の変換
変換前と変換後の「行数×列数の値」は同じにする
``` Python
li=np.array([[1,2,3,4], [5,6,7,8]])
print(li)
print(li.shape)
# [[1 2 3 4]
#  [5 6 7 8]]
# (2, 4) 2行4列

li2=li.reshape(4, 2)
print(li2)
print(li2.shape)
# [[1 2]
#  [3 4]
#  [5 6]
#  [7 8]]
# (4, 2) 4行2列

# 行数に-1を指定した場合は、列数を元にして行数は自動で設定される
# この場合は行数4になる
li2 = li.reshape(-1, 2)
print(li2)
[[1 2]
 [3 4]
 [5 6]
 [7 8]]

 # 列数に-1を指定した場合は、行数を元にして列数は自動で設定される
# この場合は列数2になる
li2 = li.reshape(4, -1)
print(li2)
[[1 2]
 [3 4]
 [5 6]
 [7 8]]
```

# NumPy配列に要素追加
元の配列と追加する配列の次元数は同じにする
``` Python
li = np.array([[1, 2, 3], [4, 5, 6]])
li2 = np.append(li, [[7, 8, 9]], axis=0)
print(li2)

[[1 2 3]
 [4 5 6]
 [7 8 9]]
```
引数axisを省略すると配列の形状が無くなる
``` Python
li = np.array([[1, 2, 3], [4, 5, 6]])
li2 = np.append(li, [[7, 8, 9]])
print(li2)

[1 2 3 4 5 6 7 8 9]
```

# 初期値を設定したNumPy配列
dtypeを省略した場合は、float64
``` Python
# 0で初期化
li = np.zeros((2, 3), dtype="float16")
print(li)
[[0. 0. 0.]
 [0. 0. 0.]]

# 1で初期化
li2 = np.ones((2, 3), dtype="int16")
print(li2)
[[1 1 1]
 [1 1 1]]

# np.emptyは、dtypeの値によって初期値が変わる
li3 = np.empty((2, 3), dtype="int16")
print(li3)
[[15360 15360 15360]
 [15360 15360 15360]]
```
 # 等差数列のNumpy配列作成
``` Python
# np.arange(開始値, 終了値, 増分)
# 終了値は含まない
li = np.arange(0, 10, 2)
print(li)
[0 2 4 6 8]

# np.linspace(開始値, 終了値, 要素数)
# 開始値から終了値までの要素数の配列を作成
# 終了値は含む
li2 = np.linspace(0, 10, 5)
print(li2)
[ 0.   2.5  5.   7.5 10. ]

```

# 条件を指定して要素を取得
``` Python
li = np.array([1, 2, 3, 4, 5])

# 奇数の要素を取得
print(li[li % 2 == 1])
[1 3 5]

# 奇数の要素のインデックス番号を取得
print(np.where(li % 2 == 1))
(array([0, 2, 4], dtype=int64),)
```
np.whereは第2引数、第3引数を指定できる
第1引数の条件に一致した場合は第2引数の値を返し、第1引数の条件に一致しない場合は第3引数の値を返す

``` Python
li = np.array([1, 2, 3, 4, 5])
print(np.where(li % 2 == 1, "奇数", "偶数"))
['奇数' '偶数' '奇数' '偶数' '奇数']
```

# NumPy配列をソート
``` Python
li = [
    [7, 2, 5],
    [6, 1, 8],
    [9, 4, 3]
]

# 行ごとにソート
print(np.sort(li))
[[2 5 7]
 [1 6 8]
 [3 4 9]]

# 列ごとにソート
print(np.sort(li, axis=0))
[[6 1 3]
 [7 2 5]
 [9 4 8]]
```

# NumPy配列を結合
np.hstach 列方向に結合
``` Python
li = np.array(
    [
        [1, 2, 3],
        [4, 5, 6]
    ])

li2 = np.array(
    [
        [10],
        [20]
    ])

# 引数はタプルで指定する
li3 = np.hstack((li, li2))
print(li3)

[[ 1  2  3 10]
 [ 4  5  6 20]]
```

np.vstack 行方向に結合
``` Python
li = np.array(
    [
        [1, 2, 3],
        [4, 5, 6]
    ])

li2 = np.array(
    [
        [10, 20, 30],
        [40, 50, 60]
    ])

# 引数はタプルで指定する
li3 = np.vstack((li, li2))
print(li3)

[[ 1  2  3]
 [ 4  5  6]
 [10 20 30]
 [40 50 60]]
```

# NumPy配列の合計
axis=0: 列ごとの合計
``` Python
li = np.array(
    [
        [1, 2, 3],
        [4, 5, 6],
        [7, 8, 9]
    ]
)

print(np.sum(li, axis=0))

[12 15 18]
```

axis=1: 行ごとの合計
``` Python
li = np.array(
    [
        [1, 2, 3],
        [4, 5, 6],
        [7, 8, 9]
    ]
)

print(np.sum(li, axis=1))

[ 6 15 24]
```

# NumPy配列の累積和
axis=0: 列ごとの累積和
``` Python
li = np.array(
    [
        [1, 2, 3],
        [4, 5, 6],
        [7, 8, 9]
    ]
)

print(np.cumsum(li, axis=0))

[[ 1  2  3]
 [ 5  7  9]
 [12 15 18]]
```

axis=1: 行ごとの累積和
``` Python
li = np.array(
    [
        [1, 2, 3],
        [4, 5, 6],
        [7, 8, 9]
    ]
)

print(np.cumsum(li, axis=1))

[[ 1  3  6]
 [ 4  9 15]
 [ 7 15 24]]
```

axisを省略した場合は、1次元配列として累積和を計算する
``` Python
li = np.array(
    [
        [1, 2, 3],
        [4, 5, 6],
        [7, 8, 9]
    ]
)

print(np.cumsum(li))

[ 1  3  6 10 15 21 28 36 45]
```