行列操作周りのメモ
ニューラルネットワーク周りが行列だらけなので。
そして僕は数式では理解できず、コードで理解する人なのでメモ(汗
スカラー
といっても、基本的には単独の値を意味する
a = 1 b = 1.5 c = 1.2e5
ベクトル(一次テンソル)
スカラを直線状に並べたもの≒一次元配列
import numpy as np a = np.array([1, 2, 3]) b = np.array([-1.1, 1.8e2, 3.14])
行列(二次テンソル)
つってもこれも有名すぎるでしょう。
c = np.array([ [1, 2, 3], [4, 5, 6] ])
多次元テンソル
複数次元のテンソルのことです
d = np.array([ [ [1, 2, 3], [4, 5, 6] ], [ [7, 8, 9], [10, 11, 12] ] ])
テンソルの次元変更を reshape
で
ソース
simple = np.array([i for i in range(24)]) reshaped = simple.reshape(4, 6) print(reshaped)
[[ 0 1 2 3 4 5] [ 6 7 8 9 10 11] [12 13 14 15 16 17] [18 19 20 21 22 23]]
ソース
print(simple.reshape(2, 2, 2, 3))
[[[[ 0 1 2] [ 3 4 5]] [[ 6 7 8] [ 9 10 11]]] [[[12 13 14] [15 16 17]] [[18 19 20] [21 22 23]]]]
ソース
print(simple.reshape(2, 3, 4))
[[[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]] [[12 13 14 15] [16 17 18 19] [20 21 22 23]]]
軸の変更
transpose
でテンソルの軸を変更できる。
インデックスを指定するので、順番に並べると何も変わらない
simple = np.array([ [1, 2, 3, 4], [2, 0, 0, 0], [3, 0, 0, 0] ]) print(simple.transpose(0, 1))
[[1 2 3 4] [2 0 0 0] [3 0 0 0]]
入れ替えると転置する
print(simple.transpose(1, 0))
[[1 2 3] [2 0 0] [3 0 0] [4 0 0]]
もうちょい複雑なものだと
simple = np.array([ [ [1, 2, 3, 4], [2, 0, 0, 0], [3, 0, 0, 0] ], [ [2, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0] ] ]) print(simple.transpose(0, 2, 1))
[[[1 2 3] [2 0 0] [3 0 0] [4 0 0]] [[2 0 0] [0 0 0] [0 0 0] [0 0 0]]]
他にも
print(simple.transpose(1, 0, 2))
[[[1 2 3 4] [2 0 0 0]] [[2 0 0 0] [0 0 0 0]] [[3 0 0 0] [0 0 0 0]]]
行列のスカラ倍
つってもこれは基本過ぎるか…
全要素に特定倍
a = np.array([ [1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12] ]) print(a * 2)
[[ 2 4 6 8] [10 12 14 16] [18 20 22 24]]
行列の各要素の積
アダマール積とか言うらしい。
同じ座標同士の掛け算
a = np.array([ [1, 2, 3], [4, 5, 6] ]) b = np.array([ [0, 1, 2], [3, 4, 5] ]) print(a * b)
[[ 0 2 6] [12 20 30]]
行列積
ドット積とかいうやつ。 高校位の数学で習う行列の掛け算はこんな感じ
a = np.array([ [1, 2, 3], [4, 5, 6] ]) b = np.array([ [0, 1], [2, 3], [4, 5] ]) print(a.dot(b))
[[16 22] [34 49]]
転置行列
つってもこれは馴染みがありすぎるか…
a = np.array([ [1, 2, 3], [6, 7, 8] ]) print(a.T)
[[1 6] [2 7] [3 8]]