疑問
>>> a = np.array([1,2,3])
>>> b = np.array([2,3,4])
>>> np.dot(a, b)
20
>>> A = np.array([[1,2],[2,3],[3,4]]) # 3x2
>>> B = np.array([[1,2,3],[2,3,4]]) # 2x3
>>> np.dot(A, B)
array([[ 5, 8, 11],
[ 8, 13, 18],
[11, 18, 25]])
上に示したように、2つの1d arrayでnumpy.dot
すると内積に、2つの2d arrayだと行列積になるが、
1d arrayと2d arrayを1つずつ渡すとどうなるか?
検証
第一引数に1d arrayを渡す
>>> A = np.array([[1,2],[2,3],[3,4]]) # 3x2
>>> b = np.array([1,2,3])
>>> np.dot(b, A)
array([14, 20])
第一引数に渡された3次元の1d arrayであるb
は1x3の2d arrayのような扱いになり、
行列積が1d arrayに変換されて返ってくる。
>>> A = np.array([[1,2],[2,3],[3,4]]) # 3x2
>>> B = np.array([[1,2,3]]) #1x3
>>> np.dot(B, A)
array([[14, 20]])
第二引数に1d arrayを渡す
>>> A = np.array([[1,2],[2,3],[3,4]]) # 3x2
>>> b = np.array([1,2])
>>> np.dot(A, b)
array([ 5, 8, 11])
第二引数に渡されたときは2x1の2d arrayのような扱いになる。
>>> A = np.array([[1,2],[2,3],[3,4]]) # 3x2
>>> B = np.array([[1],[2]]) # 2x1
>>> np.dot(A, B)
array([[ 5],
[ 8],
[11]])
結論
N次元の1d arrayは、
* numpy.dot
の第一引数に渡されたときは1xNの2d arrayのような扱いに
* numpy.dot
の第二引数に渡されたときはNx1の2d arrayのような扱いに
なり、行列積が1d arrayに変換されて返ってくる。