[numpy] numpy の Broadcasting

numpy の Broadcasting

numpy の Broadcasting という機能を紹介する.
異なる形状の ndarray 同士で演算を行おうとした場合に,演算前に形状を揃える Broadcasting が行われる.
次の2つのルールを適用した結果,演算対象の ndarray の形状が一致させることができれば,Broadcast が可能となる.

ルール1: 次元数 ndim を揃える.

演算対象の中で,一番次元数が大きい ndarray より小さい次元数を持つ ndarray は1で埋めて一番大きい次元数を揃える.

ルール2: 形状 shape を揃える.

演算対象の中で,一番次元ごとの数を見ていき,その数が1の場合のみ最も大きいものに合わせる.
その際,要素はその次元の同じ値で埋める.

ルール1,ルール2 を適用した結果,形状が一致した場合は Broadcasting 可能である.
以下にいくつかできる例を出す.

ルール1,ルール2 を適用しても形状が一致しない場合は Broadcasting はできず,演算を行おうとした場合はエラーになります.

OKなコード例

>>> a = np.array([[1, 2, 1],
                  [1, 2, 1]])
>>> b = np.array([2, 1, 2])
>>> a.shape
(2, 3)
>>> b.shape
(3,)
>>> c = a + b
>>> c
array([[3, 3, 3],
       [3, 3, 3]])
>>> c.shape
(2, 3)
>>> a = np.zeros((1, 3, 1, 5))
>>> b = np.zeros((3, 3, 2, 5))
>>> c = np.zeros((3, 1, 1))
>>> d = a + b + c
>>> d.shape
(3, 3, 2, 5)

NGなコード例

>>> a = np.zeros((2, 3, 5))
>>> b = np.zeros((3))
>>> c = a + b
ValueError: operands could not be broadcast together with shapes (2,3,5) (3,)

コメントを残す

メールアドレスが公開されることはありません。