NumPy

NumPy Quickstart チュートリアルに取り組む (4-1) ブロードキャスト

要点

ブロードキャストによって、ユニバーサル関数は、全く同じ形状を持たない入力を意味のある方法で扱うことができるようになる。

ルール1

すべての入力配列が同じ次元数を持たない場合、すべての配列が同じ次元数になるまで小さい方の配列の形状に “1 “を繰り返し付加する。

ルール2

特定の次元に沿って「1」のサイズを持つ配列が、その次元に沿って最大の形状を持つ配列のサイズを持っているかのように振る舞うことを保証する。
配列要素の値は「ブロードキャスト」配列の場合、その次元に沿って同じであると仮定される。

ブロードキャスト規則を適用した後すべての配列のサイズは一致しなければならない。

より詳細

ブロードキャストは、演算処理の際に異なる形状の配列をどのように扱うかを説明している。ある制約のもとでは小さい方の配列は大きい方の配列に「ブロードキャスト」され、互換性のある形状を持つようになる。
ブロードキャストは、配列操作をベクトル化し、PythonではなくC言語でループするようにする手段を提供する。これにより、データの不要なコピーを作成することなく、通常は効率的なアルゴリズムの実装が可能になる。
※ブロードキャストはメモリの非効率的な使用につながり、計算を遅くしてしまうため、あまり良い考えでない場合もある

NumPyの演算は通常、配列のペアに対して要素ごとに行われる。最も単純なケースでは、次の例のように、2つの配列は全く同じ形をしている必要がある。

import numpy as np

a = np.array([1.0, 2.0, 3.0])
b = np.array([2.0, 2.0, 2.0])
print(a * b)  # [ 2. 4. 6. ]

NumPyのブロードキャストルールは、配列の形状が特定の制約を満たす場合にこの制約を緩和する。最も単純なブロードキャストの例は、以下のように配列とスカラ値が演算で結合されたとき。

a = np.array([1.0, 2.0, 3.0])
b = 2.0
print(a * b)  # [ 2. 4. 6. ]

b の新しい要素は単に元のスカラーのコピーであり、ストレッチは概念的なもの。ブロードキャスト操作が可能な限りメモリと計算効率を上げるように、実際にコピーを作らずに元のスカラ値を使用する。

2番目の例のコードは1番目の例よりも効率的である。なぜなら、乗算の際にブロードキャストの方がメモリの移動量が少ないから(bは配列ではなくスカラ)