numpy

numpy行列積 メモ

More than 1 year has passed since last update.

行列積周りで混乱したところをメモ

画像の畳み込み計算

imgのテンソルとkernelのテンソルの積にnp.tensordotを使う。引数のaxisは1つの画像が格納されている次元(1,2)を指定する。

img_tensor = [[[0, 0],
               [0, 0]],
              [[1, 1],
               [1, 1]],
              [[3, 3],
               [3, 3]]]
    kernel = [[[0, 0],
               [0, 0]],
              [[1, 1],
               [1, 1]],
              [[2, 2],
               [2, 2]]]
    out = np.tensordot(img_tensor, kernel, axes=((1, 2), (1, 2)))
    print(out)
    print(np.shape(img_tensor), np.shape(kernel), '=>', np.shape(out))

-----------------
[[ 0  0  0]
 [ 0  4  8]
 [ 0 12 24]]
((3L, 2L, 2L), (3L, 2L, 2L), '=>', (3L, 3L))

データ間の内積をまとめてやりたい

$({\bf i,j})$と$({\bf k,l})$から$({\bf i}\cdot{\bf k},~{\bf j}\cdot{\bf l})$を計算したい場合、アダマール積とnp.sumで各要素の内積を計算する。(もっといいやり方ある?)

a = np.arange(4).reshape((2,2))
    b = a[::-1,::-1]
    c = np.sum(a*b,axis=1)
    print("---a---")
    print(a)
    print("---b---")
    print(b)
    print("---c---")
    print(c)

---a---
[[0 1]
 [2 3]]
---b---
[[3 2]
 [1 0]]
---c---
[2 2]