barilog

エンジニアリング見習い雑記

np.dot(a, b)で計算できるaとbの組み合わせ

np.dot(a, b)で計算できるaとbの組み合わせ

内積計算において、次元を合わせる作業は必須である。

しかし、np.dotにおいては1次元配列と多次元配列の計算においてはなぜか次元が合わなくても計算できてしまう現象が発生する。

 

本記事の目的は、np.dot(a,b)で次元が合わなくても計算が実行される際、どんな計算が行われているのかを実験により明らかにすることである。

 

 

実験1

x = [[1,2,3],[2,3,4]] #(2,3)
W = [[1,3,4],[2,3,4],[2,3,4]] # (3,3)
np.dot(W, x)

 

ValueError: shapes (3,3) and (2,3) not aligned: 3 (dim 1) != 2 (dim 0)


実験2
x = [[1,2,3],[2,3,4]] #(2,3)
W = [[1,3,4],[2,3,4],[2,3,4]] # (3,3)
np.dot(x, W)
array([[11, 18, 24],
       [16, 27, 36]])

実験3
x = [1,2,3] #(1,3)
W = [[1,3,4],[2,3,4],[2,3,4]] # (3,3)
np.dot(W, x)
array([19, 20, 20])

実験4
x = [1,2,3] #(1,3)
W = [[1,3,4],[2,3,4],[2,3,4]] # (3,3)
np.dot(x, W)
array([11, 18, 24])



実験5

f:id:barisuke:20180614111955p:plain

実験6
x = [[1],[2],[3]] #(1,3)
W = [[1,3,4],[2,3,4],[2,3,4]] # (3,3)
np.dot(W, x)
array([[19],
       [20],
       [20]])



実験1,2より
多次元配列と多次元配列の計算の場合は、引数の順番を合わせる/またはtransposeすることにより次元を合わせる必要がある 

実験3,4より
一次元配列と多次元配列の計算の場合は、次元が合わない場合勝手にtransposeが起こる。

ということがわかった。

つまり、

np.dot()において

次元が合わなくても計算ができてしまうのは

1次元配列と多次元配列の内積計算の時のみで、その時は1次元配列の転置が自動的に行われるということである。