行列積
NumPy の配列や PyTorch のテンソルを用いた行列積を計算する方法を解説する。行列積を求めるにはいくつかの方法が用意されているが、本資料では「@」演算子の利用を推奨する。
1次元と2次元配列の場合
2次元配列で表した行列と、1次元配列で表したベクトルとの間で行列積を求める。
code:mat_mul1.py
import numpy as np
A = np.array(1, 2], [4, 5)
x = np.array(1, 2)
print('A:', A.shape)
print('x:', x.shape)
y1 = A@x
y2 = x@A
print('y1=A@x:\n', y1, y1.shape)
print('y2=x@A:\n', y2, y2.shape)
ポイント
Aとxの順序を入れ替えた場合でも、行列とベクトルの演算ルールに基づいたに計算が行われる。
結果は1次元配列となる。
1次元配列に「タテ」や「ヨコ」のような軸の概念はないことに注意。転置をとっても形状は同じである。
code:mat_mul2.py
import numpy as np
x1 = np.array(1, 2, 3, 4)
x2 = x1.T # .Tは転置
print('x1:', x1, x1.shape)
print('x2:', x2, x2.shape)
2次元配列同士の場合
2次元配列同士の行列積を求める。
ベクトル v については2次元配列を用いることで、いわゆる「縦ベクトル」としている。
code:mat_mul3.py
import numpy as np
A = np.array(1, 2, 3], [4, 5, 6)
B = np.array(2, 1], 3, 1, [1, 1)
v = np.array(1], [2) # ★配列を用いて「縦」ベクトルを表現
print('A:', A.shape)
print('B:', B.shape)
print('x:', v.shape)
y1 = A@B
y2 = B.T@A.T
y3 = v.T@A # ★ 縦ベクトルの転置をとって横ベクトルとしている
y4 = B@v # ★
print('y1=A@x:\n', y1, y1.shape)
print('y2=A@B:\n', y2, y2.shape)
print('y3=v.T@A:\n', y3, y3.shape)
print('y4=B@x:\n', y4, y4.shape)
ポイント
2次元配列同士の演算の結果、2次元配列が得られている。
PyTorchの提供するテンソルの場合も、配列と同じやりかたで計算を行うことができる。
https://scrapbox.io/files/65045216e0056b001b1e205f.png