データ分析実践
初級問題チェック

問題 17 /40

NumPyのブロードキャストでエラーになるものはどれか。

選択 1

a = np.array([1, 2, 3]) b = np.array([[4, 5, 6], [7, 8, 9]]) a + b

選択 2

a = np.array([1, 2, 3]) b = np.array([[4], [5], [6]]) a - b

選択 3

a = np.array([1, 2, 3]) b = np.array([[4, 5], [6, 7], [8, 9]]) a * b

選択 4

a = np.array([1, 2]) b = np.array([[3], [4], [5]]) a + b

解説

選択肢3が正解です。 ブロードキャストは、異なるサイズの配列に対して加算や乗算などの演算をする機能のことです。 以下の演算の場合、数値の「2」が、aの配列の形状に合わせて[2, 2, 2]と引き伸ばされて、aの各要素に掛けられます。この引き伸ばしがブロードキャストです。 a = np.array([1, 2, 3]) a * 2 ▶︎ array([2, 4, 6]) このように数値(スカラー)の場合は全ての配列にブロードキャストが可能ですが、配列同士の演算はルールがあり、配列の形状によってはブロードキャストできない場合があります。 【選択肢1】 a = np.array([1, 2, 3]) b = np.array([[4, 5, 6], [7, 8, 9]]) a + b ▶︎ array([[ 5, 7, 9], [ 8, 10, 12]]) aの[1, 2, 3]が、bの形状に合わせて[1, 2, 3],[1, 2, 3]に引き伸ばされて、bの各要素に加算されます。 【選択肢2】 a = np.array([1, 2, 3]) b = np.array([[4], [5], [6]]) a - b ▶︎ array([[-3, -2, -1], [-4, -3, -2], [-5, -4, -3]]) ブロードキャストは、お互いを引き伸ばして演算することもあります。 まず、aの[1, 2, 3]がbの行数に合わせて引き伸ばされ次の形状になります。 [1, 2, 3] [1, 2, 3] [1, 2, 3] 次に、bの[[4], [5], [6]]がaの列数に合わせて引き伸ばされて次の形状になります。 [4, 4, 4] [5, 5, 5] [6, 6, 6] 最後に、aの各要素からbの各要素を引いて次の結果になります。 [-3, -2, -1] [-4, -3, -2] [-5, -4, -3] 【選択肢3】 a = np.array([1, 2, 3]) b = np.array([[4, 5], [6, 7], [8, 9]]) a * b ▶︎ ValueError: operands could not be broadcast together with shapes (3,) (3,2) aの形状が(3,)、bの形状が(3, 2)で、引き伸ばしができません。 ブロードキャストは次のルールがあります。 【1】shape属性の数字を右揃えで並べる。 【2】縦に見て数字が1つの場合は問題なし。縦に見て数字が2つある場合、それらが同じ数字か、どちらかが1になっていればブロードキャストできる。 ■ ブロードキャストできる例 (3, 4)と(4,) ▶︎ 3 4 4 *左の列は数字が1つだけのため問題なし。右の列は数字が上下で一致しているため問題なし。 (3, 4)と(3, 1) ▶︎ 3 4 3 1 *左の列は上下で数字が一致しているため問題なし。右の列は下が1のため問題なし。 (1, 3)と(4, 1) ▶︎ 1 3 4 1 *左の列は上が1のため問題なし。右の列は下が1のため問題なし。 (2, 3, 4)と(3, 1) ▶︎ 2 3 4 3 1 *左の列は数字が1つのため問題なし。中央の列は数字が上下で一致しているため問題なし。右の列は下の数字が1のため問題なし。 ■ ブロードキャストできない例 (3,)と(3, 2) ▶︎ 3 3 2 *選択肢3と同じ形状。左の列は数字が1つのため問題なし。右の列は上下で数字が不一致のためブロードキャストできない。 (3, 4)と(4, 1) ▶︎ 3 4 4 1 *左の列が上下で数字が不一致のためブロードキャストできない。 (2, 3, 4)と(3,) ▶︎ 2 3 4 3 *右の列が上下で数字が不一致のためブロードキャストできない。 【選択肢4】 a = np.array([1, 2]) b = np.array([[3], [4], [5]]) a + b ▶︎ array([[4, 5], [5, 6], [6, 7]]) aが(2,)、bが(3, 1)で、左の列は数字が一つ、右の列は1が含まれているため、引き伸ばしができます。 まず、aの[1, 2]がbの行数に合わせて引き伸ばされ、次の形状になります。 [1, 2] [1, 2] [1, 2] 次に、bの[[3], [4], [5]]がaの列数に合わせて引き伸ばされ、次の形状になります。 [3, 3] [4, 4] [5, 5] 最後に、aの各要素とbの各要素を足して次の結果になります。 [4, 5] [5, 6] [6, 7] (公式書籍 p.139-143)