NumPy — 配列演算の力
このトピックを終えると
numpyのndarrayとは何かを説明でき、リストとの違いと基本的な演算を行えるようになります。
numpyとは
numpy(ナムパイ)はPythonで大量の数値データを高速に処理するライブラリです。
python
import numpy as np
# リスト → ndarrayarr = np.array([1, 2, 3, 4, 5])print(arr) # [1 2 3 4 5]print(type(arr)) # <class 'numpy.ndarray'>npはnumpyの慣例的な略称です。
なぜリストではなくnumpyなのか
速度の違い
python
import numpy as np
# 100万個の要素それぞれに2を掛ける
# 純粋なPythonリストpy_list = list(range(1_000_000))result = [x * 2 for x in py_list] # 遅い
# numpynp_arr = np.arange(1_000_000)result = np_arr * 2 # 速い(10〜100倍)numpyは内部的にCで書かれており、連続したメモリに同じ型のデータを格納します。Pythonリストは各要素が独立したPythonオブジェクトですが、ndarrayはメモリが連続しているためCPUキャッシュに有利です。
ベクトル演算
python
import numpy as np
a = np.array([1, 2, 3])b = np.array([4, 5, 6])
# 要素ごとの演算 — ループなしでprint(a + b) # [5 7 9]print(a * b) # [4 10 18]print(a ** 2) # [1 4 9]print(a > 2) # [False False True]リストでこれをやるにはfor文を回す必要があります。numpyなら1行で終わります。
配列の作成
python
import numpy as np
# 直接作成a = np.array([1, 2, 3])
# 0で埋めた配列zeros = np.zeros(5) # [0. 0. 0. 0. 0.]
# 1で埋めた配列ones = np.ones(3) # [1. 1. 1.]
# 連続する数値seq = np.arange(0, 10, 2) # [0 2 4 6 8]
# 均等間隔lin = np.linspace(0, 1, 5) # [0. 0.25 0.5 0.75 1. ]多次元配列
python
import numpy as np
# 2次元配列(行列)matrix = np.array([ [1, 2, 3], [4, 5, 6]])print(matrix.shape) # (2, 3) — 2行3列print(matrix[0, 1]) # 2 — 0行目、1列目print(matrix[:, 0]) # [1 4] — 全行の0列目
# 3次元も可能cube = np.zeros((2, 3, 4))print(cube.shape) # (2, 3, 4)shapeは配列のサイズをタプルで返します。データ分析、画像処理、機械学習でshapeを頻繁に確認します。
よく使う演算
python
import numpy as np
arr = np.array([3, 1, 4, 1, 5, 9, 2, 6])
print(arr.sum()) # 31print(arr.mean()) # 3.875print(arr.std()) # 2.588...print(arr.min()) # 1print(arr.max()) # 9print(arr.argmax()) # 5(最大値のインデックス)
# ソートprint(np.sort(arr)) # [1 1 2 3 4 5 6 9]
# 条件フィルタprint(arr[arr > 3]) # [4 5 9 6]
# reshape — 形状変換reshaped = arr.reshape(2, 4)print(reshaped)# [[3 1 4 1]# [5 9 2 6]]ブロードキャスティング
サイズが異なる配列同士でも演算が可能です。
python
import numpy as np
matrix = np.array([ [1, 2, 3], [4, 5, 6]])
# 各行に[10, 20, 30]を足すrow = np.array([10, 20, 30])print(matrix + row)# [[11 22 33]# [14 25 36]]numpyが自動的にrowを2行に拡張して演算します。これを**ブロードキャスティング(broadcasting)**といいます。明示的にループを書く必要がありません。