データ分析・中級問題チェック
問題 18 /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が正解です。
ブロードキャストとは、異なるサイズの配列に対して加算や乗算などの演算をする機能のことです。
次のように配列と数値(スカラー)の演算であれば、配列の各要素と数値の演算がブロードキャストです。
a = np.array([1, 2, 3])
a * 2
▶︎ array([2, 4, 6])
この場合、数値の「2」が、aの配列の形状に合わせて[2, 2, 2]と引き伸ばされて、aの各要素に掛けられています。この引き伸ばしがブロードキャストです。
このように数値の場合は単純ですが、配列同士の演算はルールがあり、配列の形状によってはブロードキャストできない場合があります。
【選択肢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の列数に合わせて引き伸ばされて次の形状になります。aは1次元配列のため実際は「3列」ではありませんが、ブロードキャストでは「1行3列」と考えます。
[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が1行3列、bが3行2列で、列数が合わないため引き伸ばしができません。
選択肢2も、aが1行3列、bが3行1列で列数が合いませんが、1次元の配列aを1行3列から3行1列に転置すると列数が合うため、引き伸ばしができます。
ブロードキャストは次のルールで概ね対応できます。
● 列数が一致している場合は引き伸ばしができる。
● 1次元の配列を転置して列数が合えば引き伸ばしができる。
● この2つのルールから外れる場合は引き伸ばしができない。
【選択肢4】
a = np.array([1, 2])
b = np.array([[3],
[4],
[5]])
a + b
▶︎ array([[4, 5],
[5, 6],
[6, 7]])
aが1行2列、bが3行1列で形状が合いませんが、1次元の配列aを転置すると2行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]
なお、aの[1, 2]を実際に「a.T」で転置すると、[1, 2]となり形状は変わりません。今回のルールの中で説明した「転置」とは、実際は次元数を変換することを意味しています。aの場合は、「a[:, np.newaxis]」として、[[1],[2]]に変換します。ただ、ブロードキャストでは1次元の配列[1, 2]を1行2列と見立てて、「2行1列に転置する」と考えた方が分かりやすいため、ここでは「転置」と表現しています。
(公式書籍 p.124-128)