numpyの行列計算(tensor×matrix)
ベクトル同士、行列×ベクトルだとイメージしやすいが、テンソル(※)×行列は頭の中でイメージするのが難しい場合がある。
※ここでは、3階以上の階数の行列を指す
結論を先に書いておくと、
3階テンソル | 行列 | 内積 |
m×n×k | k×p | m×n×p |
また、
行列 | 3階テンソル | 内積 |
p×k | m×k×n | p×m×n |
numpyで簡単な数字で確認してみた。
テスト①
import numpy tensor = numpy.ones([3, 4, 2]) matrix = numpy.ones([2, 3]) print matrix.shape print matrix (2L, 3L) [[ 1. 1. 1.] [ 1. 1. 1.]] print numpy.dot(tensor, matrix) [[[ 2. 2. 2.] [ 2. 2. 2.] [ 2. 2. 2.] [ 2. 2. 2.]] [[ 2. 2. 2.] [ 2. 2. 2.] [ 2. 2. 2.] [ 2. 2. 2.]] [[ 2. 2. 2.] [ 2. 2. 2.] [ 2. 2. 2.] [ 2. 2. 2.]]]
3×4×2のテンソルと2×3の行列なので、
まず、4×2と2×3の内積をとる。(4×3)それ×3
テスト②
import numpy tensor = numpy.ones([3, 4, 2]) print tensor.shape print tensor (3L, 4L, 2L) [[[ 1. 1.] [ 1. 1.] [ 1. 1.] [ 1. 1.]] [[ 1. 1.] [ 1. 1.] [ 1. 1.] [ 1. 1.]] [[ 1. 1.] [ 1. 1.] [ 1. 1.] [ 1. 1.]]] matrix = numpy.ones([2, 4]) print matrix.shape print matrix (2L, 4L) [[ 1. 1. 1. 1.] [ 1. 1. 1. 1.]] print numpy.dot(tensor, matrix) [[[ 2. 2. 2. 2.] [ 2. 2. 2. 2.] [ 2. 2. 2. 2.] [ 2. 2. 2. 2.]] [[ 2. 2. 2. 2.] [ 2. 2. 2. 2.] [ 2. 2. 2. 2.] [ 2. 2. 2. 2.]] [[ 2. 2. 2. 2.] [ 2. 2. 2. 2.] [ 2. 2. 2. 2.] [ 2. 2. 2. 2.]]]
4×2の行列と2×4の内積をとる。(4×4)それ×3
テスト③
import numpy tensor = numpy.ones([3, 4, 2]) matrix = numpy.ones([2, 5]) print matrix.shape print matrix (2L, 5L) [[ 1. 1. 1. 1. 1.] [ 1. 1. 1. 1. 1.]] print numpy.dot(tensor, matrix) [[[ 2. 2. 2. 2. 2.] [ 2. 2. 2. 2. 2.] [ 2. 2. 2. 2. 2.] [ 2. 2. 2. 2. 2.]] [[ 2. 2. 2. 2. 2.] [ 2. 2. 2. 2. 2.] [ 2. 2. 2. 2. 2.] [ 2. 2. 2. 2. 2.]] [[ 2. 2. 2. 2. 2.] [ 2. 2. 2. 2. 2.] [ 2. 2. 2. 2. 2.] [ 2. 2. 2. 2. 2.]]]
4×2の行列と2×5の内積をとる。(4×5)それ×3
テンソルのm×n×kの場合、行列はk×pである必要がある。
テンソル×行列の内積をとった後のテンソルは、「m×n×p」の形となる。