数値計算の土台、NumPy。ndarrayとブロードキャストを理解すれば一気に楽になります。
NumPyって何ができるの?
高速な数値配列計算ライブラリね。 リストより数十〜百倍速くて、機械学習の前処理から計算まで広く使うのよ。
中心はndarray(N次元配列)ですね。 1次元はベクトル、2次元は行列、3次元以上はテンソルになります。
import numpy as np # 基本作成 a = np.array([1, 2, 3, 4, 5]) # 1次元配列 b = np.array([[1, 2], [3, 4]]) # 2次元配列 z = np.zeros((3, 4)) # 3x4のゼロ行列 i = np.eye(3) # 3x3の単位行列 r = np.random.randn(100) # 標準正規分布から100サンプル # 形状確認 print(a.shape) # (5,) print(b.shape) # (2, 2) print(b.dtype) # int64 print(b.ndim) # 2 (次元数) # 演算 (ベクトル化) doubled = a * 2 # [2, 4, 6, 8, 10] added = a + np.array([10,10,10,10,10]) # [11,12,13,14,15] squared = a ** 2 # [1, 4, 9, 16, 25] # 統計関数 mean = a.mean() # 3.0 std = a.std() # 標準偏差 max_val = a.max() # 5 argmax = a.argmax() # 4 (最大値のインデックス)
ベクトル化って?
forループを書かずに、配列全体に演算を一括適用することです。 これがNumPyが速い理由ですよ。
ブロードキャストって何のこと?
# ブロードキャスト: 形状の違う配列同士を自動で揃える
matrix = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
row = np.array([10, 20, 30]) # shape: (3,)
result = matrix + row # 各行に row が足される
# [[11, 22, 33],
# [14, 25, 36],
# [17, 28, 39]]
# 各列の標準化 (z変換)
X = np.random.randn(100, 5)
X_std = (X - X.mean(axis=0)) / X.std(axis=0)
ブロードキャストは次元が違う配列同士を、自動で次元を揃えて計算してくれる仕組みなのよ。 これでループを書かずに、行列と行ベクトルを足せるの。
axis=0は『行方向(列ごと)』、axis=1は『列方向(行ごと)』という指定です。 つまりX.mean(axis=0)は各列の平均ということですね。
axis、覚えにくいよぉ…
『axis=その軸を潰す方向』と覚える。 axis=0 を潰すと行が消えて列ごとの結果が残る、 axis=1 を潰すと列が消えて行ごとの結果が残る。
DS検定★では『ndarray の形状』『ブロードキャスト』『axis の意味』『argmax/mean等の集計関数』が頻出よ。
確認クイズ
(3,4) の行列 X に対し X.mean(axis=0) の結果のshapeは何か。
- (3,)
- (4,)
- (3,4)
- スカラー
こたえを見る
正解: 2. (4,)
(4,)。 axis=0 で行方向を潰すので、列ごとの平均が得られて長さ4のベクトルになります。 (列が4つあるため)。