PyTorchやTensorFlowなどの機械学習ライブラリを扱う上で避けては通れないのがNumPy。
機械学習では多次元配列の数値をたくさん扱います。その時に効率的に計算してくれるライブラリとして使っているだけなので、難しい話はないです。
とりあえずNumPyはこんな感じで使うんだなーって分かっておけば、機械学習のライブラリを学ぶときも混乱が少ないと思います。
NumPyのインストール
NumPyはpipコマンドでインストールできます。
以下のコマンドを使って、NumPyをインストールしましょう。
pip install numpy
配列の作成
NumPyを使って多次元配列を作成してみましょう。NumPyで扱う配列 (NumPy配列) は、Pythonのリストとは違って同じ型の要素を持つという点に注意してください。
numpy.arrayでPythonのリストを渡すとNumPy配列を作成できます。
import numpy as np
# 1次元配列の作成
arr1d = np.array([1, 2, 3, 4, 5])
print(arr1d)
# 2次元配列の作成
arr2d = np.array([[1, 2, 3], [4, 5, 6]])
print(arr2d)
# 3次元配列の作成
arr3d = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
print(arr3d)
実行結果
[1 2 3 4 5] [[1 2 3] [4 5 6]] [[[1 2] [3 4]] [[5 6] [7 8]]]
Pythonのリストから変換する以外に、タプルで形状を指定してNumPy配列を作成する方法もよく使用します。1次元配列の場合は (n,)
のように、2次元配列の場合は (m, n)
のように指定します。
import numpy as np
# 2行3列の0で初期化された配列を生成
arr1 = np.zeros((2, 3))
print(arr1)
# 3行3列の1で初期化された配列を生成
arr2 = np.ones((3, 3))
print(arr2)
実行結果
[[0. 0. 0.] [0. 0. 0.]] [[1. 1. 1.] [1. 1. 1.] [1. 1. 1.]]
NumPy配列の形状変更
NumPy配列を使っていると、次元数などの形状を変えたいということがよくあります。形状の変更によく使うのはreshape関数とflatten関数です。
import numpy as np
# 1次元配列を作成
arr1d = np.array([[1, 2, 3], [4, 5, 6]])
# 配列の形状を返す
print(arr1d.shape) # (2, 3)
# 配列の要素数を返す
print(arr1d.size) # 6
# 形状を変更
arr2d = arr1d.reshape(6,)
print(arr2d.shape) # (6,)
arr3d = arr1d.reshape(10,) # エラー:元の配列が要素数6なので、要素数10の形状に変更できない
#多次元の配列を1次元の配列に変換
arr3d = arr1d.flatten()
print(arr3d.shape) # (6,)
配列のスライス
NumPy配列のスライス(slice)は、Pythonのリストと同じように、配列の一部を抽出するための方法です。スライスを使用することで、配列から必要な部分を取り出して利用することができます。
スライスは、開始インデックス、終了位置をコロンで区切って指定します。開始インデックスは0始まりですが、終了位置の1要素目は1なので注意してください。
どちらも省略可能で、開始インデックスのデフォルト値は0、終了位置のデフォルト値は要素の数と等しくなります。
以下は、NumPy配列をスライスする例です。
import numpy as np
# 1次元配列のスライス
arr1 = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
print(arr1[2:7]) # [3 4 5 6 7]
print(arr1[:5]) # [1 2 3 4 5]
print(arr1[3:]) # [4 5 6 7 8 9]
print(arr1[:]) # [1 2 3 4 5 6 7 8 9]
多重配列の場合はカンマで軸を区切って指定します。
import numpy as np
# 2次元配列のスライス
arr2 = np.array([
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
])
# 配列の1行目を取得
arr_row_1 = arr2[0, :]
print(arr_row_1) # [1 2 3]
# 配列の2列目を取得
arr_column_2 = arr2[:, 1]
print(arr_column_2) # [2 5 8]
# 配列の2行目から3行目、2列目から3列目を取得
arr_sub = arr2[1:3, 1:3]
print(arr_sub)
# [[5 6]
# [8 9]]
配列の結合 – concatenate –
concatenate()関数を使ってNumPy配列同士を結合することができます。多次元配列を結合する際はどの軸を基準にして結合するか考えなくてはなりません。NumPyではaxisパラメータで軸を指定します。
import numpy as np
# 2つの1次元配列を作成
arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])
# 配列の結合
arr_concat = np.concatenate([arr1, arr2])
print(arr_concat) # [1 2 3 4 5 6]
# 2つの2次元配列を作成
arr3 = np.array([[1, 2], [3, 4]])
arr4 = np.array([[5, 6], [7, 8]])
# 行方向の結合
arr_row_concat = np.concatenate([arr3, arr4], axis=0)
print(arr_row_concat)
# [[1 2]
# [3 4]
# [5 6]
# [7 8]]
# 列方向の結合
arr_column_concat = np.concatenate([arr3, arr4], axis=1)
print(arr_column_concat)
# [[1 2 5 6]
# [3 4 7 8]]