NumPy入門⑦ ブロードキャストと応用
ブロードキャストとは?
NumPyの「ブロードキャスト」とは、異なる形状の配列同士でも自動的に形を揃えて計算する仕組み です。
通常のプログラミング言語では行や列のサイズが一致しないとエラーになりますが、NumPyでは柔軟に拡張されます。
スカラーと配列の演算
スカラー値(単一の数値)は、自動的に配列全体へ拡張されます。
import numpy as np
a = np.array([1, 2, 3, 4])
print(a + 10) # [11 12 13 14]
print(a * 2) # [2 4 6 8]
配列同士のブロードキャスト
形状が異なっても「次元を拡張できる場合」は演算可能です。
A = np.array([[1, 2, 3],
[4, 5, 6]])
b = np.array([10, 20, 30])
print(A + b)
# [[11 22 33]
# [14 25 36]]
ここでは b が縦方向に複製されて、A と同じ形状に拡張されて計算されています。
行ベクトルと列ベクトル
二次元配列同士でも、形状が揃うようにブロードキャストされます。
x = np.array([[1], [2], [3]]) # 列ベクトル (3,1)
y = np.array([10, 20, 30]) # 行ベクトル (3,)
print(x + y)
# [[11 21 31]
# [12 22 32]
# [13 23 33]]
ブロードキャストのルール
NumPyでは以下のルールで次元が比較されます。
- 配列の次元数が異なる場合、足りない次元を「1」とみなして揃える
- 各次元のサイズを比較し、一方が「1」なら他方に合わせて拡張される
- 両方の次元が異なり、かつ「1」でもなければエラー
実用例① 正規化
配列を平均0・分散1に正規化する処理もブロードキャストで簡単に書けます。
data = np.array([[1, 2, 3],
[4, 5, 6]])
mean = np.mean(data, axis=0) # 列ごとの平均
std = np.std(data, axis=0) # 列ごとの標準偏差
normalized = (data - mean) / std
print(normalized)
実用例② 画像処理
RGB画像データ(高さ×幅×3)に対して、色補正を行うときもブロードキャストが活用されます。
# 仮のRGB配列 (2x2画像)
img = np.array([[[100, 150, 200],
[120, 180, 220]],
[[130, 170, 210],
[140, 160, 230]]])
# 各色チャネルの補正値
offset = np.array([10, -20, 30])
# 自動的に拡張され、各チャネルに適用される
corrected = img + offset
print(corrected)
まとめ
- ブロードキャストは「形状が違う配列同士でも計算可能にする仕組み」
- スカラーは自動的に全要素に適用される
- 次元ルールに従えば行ベクトルと列ベクトルも演算可能
- データの正規化や画像処理などの応用に役立つ