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行目にコピーされない