データ分析・上級問題チェック
問題 18 /40
NumPyの演算でエラーになるものはどれか。
次の配列が定義されているものとする。
a = np.array([1, 1])
b = np.array([2, 2])
c = np.array([[2, 2]])
d = np.array([[3, 3],
[4, 4]])
e = np.array([[5, 5],
[6, 6],
[7, 7]])
選択 1
a * b
選択 2
np.dot(a, b)
選択 3
np.dot(d, c)
選択 4
np.dot(d, e.T)
解説
選択肢3が正解です。
数学の線形代数では「ドット積」はベクトル同士の内積を意味します。数学の線形代数の場合、行列同士の積は「ドット積」ではありません。ただ、Numpyのdot関数は、ベクトル同士の内積だけではなく、行列同士の積にも使えます。
以下は問題文で定義した配列です。
a = np.array([1, 1])
b = np.array([2, 2])
c = np.array([[2, 2]])
d = np.array([[3, 3],
[4, 4]])
e = np.array([[5, 5],
[6, 6],
[7, 7]])
【選択肢1】
a * b
▶︎ array([2, 2])
要素同士を掛け算する「アダマール積」です。dot関数は要素同士を掛けてから足しますが、「*」は要素同士を掛けるだけです。
【選択肢2】
np.dot(a, b)
▶︎ 4
ベクトル同士のため内積を計算します。要素同士を掛けて足すため、結果はスカラー(数値)で返ります。
【選択肢3】
np.dot(d, c)
▶︎ ValueError
「np.dot(d, c)」は2行2列の行列と、1行2列の行列の積となります。
行列同士の積は、2行2列と2行1列のように、内側の数が一致していないとできないため、「np.dot(d, c)」はValueErrorになります。
ベクトルの内積と行列の積は、中級問題10と上級問題9で詳しく解説しています。
【選択肢4】
np.dot(d, e.T)
▶︎ array([[30, 36, 42],
[40, 48, 56]])
「np.dot(d, e)」であれば、2行2列と3行2列の積となり、内側の数が一致していないためValueErrorになります。
選択肢4の場合、eを2行3列に転置しており、2行2列と2行3列の積になっているため計算が可能です。
なお、Python3.5から内積と行列の積で「@」演算子が使えるようになりました。問題文の場合、「a @ b」で内積、「c @ d」で行列の積が計算できます。
(公式書籍 p.128-130)