配列(ndarray)のベクトル演算とブロードキャスティング

概要

ndarrayには、ベクトル演算とブロードキャスティングという配列要素の一つ一つではなく、全体をまとめて演算する記述方法あります。これにより、forループ等を使わない簡潔なプログラムが書けて、演算速度もループを使うより圧倒的に高速になるという利点があります。

ベクトル演算

同じ大きさの配列同士の演算

同じ大きさの配列同士に各種演算子を適用すると、配列全体について同位置の要素同士の演算が行われます。

>>> a = np.array([0, 1, 2, 3, 4])
>>> b = np.array([3, 5, 6, 1, 2])
>>> a + b  # 足し算
array([3, 6, 8, 4, 6])
>>> a * b  # 掛け算
array([ 0,  5, 12,  3,  8])
>>> a ** b  # べき乗
array([ 0,  1, 64,  3, 16])
>>> a > b  # 比較演算
array([False, False, False,  True,  True])

ブロードキャスティング

配列とスカラー値の演算

配列とスカラー値に各種演算子を適用すると、配列の各要素とスカラー値の演算が行われます。

>>> a = np.array([0, 1, 2, 3, 4])
>>> a + 1
array([1, 2, 3, 4, 5])
>>> a * 2
array([0, 2, 4, 6, 8])
>>> a > 2
array([False, False, False,  True,  True])
>>> a == 2
array([False, False,  True, False, False])

大きさの異なる配列同士の演算

配列同士のブロードキャスティングをするには下記の条件を満たしている必要があります。

・二つの配列が同じ次元であること。
・次元の一つは1であること。

(2,3)の配列と(1,3)の配列の演算例を示します。

>>> a = np.array([[0, 1, 2],
	          [3, 4, 5]])
>>> b = np.array([[10, 20, 30]])
>>> a.shape
(2, 3)
>>> b.shape
(1, 3)
>>> a + b
array([[10, 21, 32],
       [13, 24, 35]])

(3,1)の配列と(1,3)の配列の演算だと次のようになります。

>>> a = np.array([[0],
	          [1],
	          [2]])
>>> b = np.array([[10, 20, 30]])
>>> a.shape
(3, 1)
>>> b.shape
(1, 3)
>>> a + b
array([[10, 20, 30],
       [11, 21, 31],
       [12, 22, 32]])