broadcast

ブロードキャストはnumpy が備える,配列演算の拡張ルールである.まずブロードキャストのルールは,二つのnumpy array (nda, ndb)での演算について,多くの解説とは違うが見延が分かりやすいと考える表現で言うと,次の通りとなる.

    1. まず,ndaとndbのshapeを比較して,次元数が大きい方に合せて,小さい方の最初のaxisのいくつかに1を足して同じ次元数にする.

    2. ブロードキャストが可能である条件は,1の処理をした後の両者の配列が,同一サイズか一方が1かであることである.

    3. 2の条件が満たされれば,ブロードキャスト演算を行う.ブロードキャスト演算では,ある配列の要素数が1の軸はその軸についてもう一方の配列の要素数の数だけ同じデータが繰り返されているかのように扱って演算する.ただしデータのコピーを行うわけではない.

    4. 3の条件に該当する軸が見つからないと,エラーとなる.

たとえば,ndaのshapgeが(3,2)で,ndbのshapeが(2,)なら,ルール1は後者の最初のaxisに1を足して(1,2)とする.こうして得られる(3,2)と(1,2)という配列はルール2を満たしているので,ルール3のブロードキャスト演算が行われる.

一方ndaのshapeが(2,3)でndbが(2,)だとしよう.ルール1ではやはりndbが(1,2)の配列に変換される.しかし両者を比較するとaxis=1でndaの要素数が3でnbaの要素数が2となって,2の条件を満たさない.そのためエラーとなる.ただし,ndbをreshapeして(2,1)の形に変えればブロードキャスト演算が可能である.このreshapeでブロードキャストを可能にする方法は,重要だ.

ルール2と3を別な表現で言えば,二つの配列の要素数の数が,右側の軸から並べて同一か片一方が1であればブロードキャストだ可能だということになる.たとえば,両者の配列のshapeの組が,(2,3,4,5)と(5), (2,3,4,5)と(4,5), (2,3,4,5)と(3,4,5), (2,3,4,5)と(3,1,5)はブロードキャストが可能である.一方,(2,3,4)と(3,), (2,3,4)と(4,1)などはブロードキャストができない.

ブロードキャストは直感的に理解するのが難しいので,実際に演算してみるといいだろう,たとえばnp.ones([2,3,4,5])+np.ones([4,5])などとして,配列のshapeをいろいろに変えてみれば,よく理解できるだろう.