読者です 読者をやめる 読者になる 読者になる

gggggraziegrazie

graizegrazieさんのやったこと、学んだことを記録する雑記帳です

Numpyでの行列の扱い方

Numpyで行列を作る場合、下記の3種類の方法がある。

①numpy.array([1, 2], [3, 4])
②numpy.matrix(numpy.array([1, 2], [3, 4]))
③numpy.mat(numpy.array([1, 2], [3, 4]))

上記の挙動について調べたことを下記に示す。

足し算・引き算

import numpy as np

a = np.array([2, 2])
a.shape -> (2, )

b = np.array([[1, 2], [3, 4]])
b.shape -> (2, 2)

a - b   -> array([[1 , 0],
                  [-1, -2]]) 
# なんと計算できちゃいます。aの1行目が2行目にもコピーされ、
# 2行2列の行列として扱われます。

c = np.matrix([[1, 2, 3], [4, 5, 6]])
c.shape -> (2, 3)

a - c   -> error! # 相手のデータタイプがmatrixだと、aとcのデータタイプが異なるからなのか、aは2行2列とは扱わないです。

掛け算

①の方法を採用する時、行列aとbの掛け算はnumpy.dot(a, b)とする必要がある。もしもa * bとすると、それは各要素毎に掛け算を行うことを意味する。②、③の時は、a * bでもnumpy.dot(a, b)のどちらでもよい。以上をコードで表すと下記の様になる。

import numpy as np

a = np.array([[1, 2], [3, 4]])
b = np.array([[4, 3], [2, 1]])

a * b        -> array([[4 , 6]
                       [6 , 4]]) # a * b[0][0] = a[0] * b[0] となっている
np.dot(a, b) -> array([[8 , 5],
                       [20, 13]])

c = np.matrix(np.array([[1, 2], [3, 4]]))
d = np.matrix(np.array([[4, 3], [2, 1]]))

c * d        -> matrix([[8 , 5],
                        [20, 13]])
np.dot(c * d)-> matrix([[8 , 5],
                        [20, 13]])

e = np.mat(np.array([[1, 2], [3, 4]]))
f = np.mat(np.array([[4, 3], [2, 1]]))

e * f        -> matrix([[8 , 5],
                        [20, 13]])
np.dot(e * f)-> matrix([[8 , 5],
                        [20, 13]])

g = np.array([1, 2])
g * a        -> error!
np.dot(a, a) -> error!
# 掛け算の場合、足し算・引き算と異なり、1行目は2行目にコピーされない