Numpyで*を使わないほうが良い理由
それはnp.arrayとnp.matrixに依って計算内容が異なるからです。
以下にもっと詳しい記事があるので時間のある人はこちらを参照されたし。
ksknw.hatenablog.com
numpyの型について
numpyを使うことでmatlabとほぼ同様に計算をすることができます。
主にarray型とmatrix型がありますが、どちらもnp.asmatrixやnp.asarrayで相互変換可能です。
stackoverflow.com
MATLAB使いの方はmatrix型で使ったほうが混乱が少なくていいと思います。
なぜならarrayの型では少なくとも行列の積において掛け算に混乱が生じるからです。
やってみる
import numpy as np A = np.array([1,2,3,4]).reshape(2,2) B = np.matrix([1,2,3,4]).reshape(2,2) A2 = A*A B2 = B*B
結果はこちら
A2 => array([[ 1, 4], [ 9, 16]]) B2 => matrix([[ 7, 10], [15, 22]])
「*」オペレータは
「array」だと「要素ごとの積」
「matrix」だと「行列の積」
を表すことがわかります。
numpyには
「np.multiply(X,Y)」(要素ごとの積)
と
「np.dot(X,Y)」(通常の掛け算)
という関数があるので誤解を避けたければこういった関数を使ったほうがいいのではないかと思います。
特に何らかの返り値としてnumpyのオブジェクトを受け取ったときはしばしばarray型になっていることもあるので、デバッグの際にも非常に見つかりにくいです。
全部matrixとしてしまう解決策
それでも「*」のかわりに「np.dot()」と書くのは少し手間なので、
以下のように変換をしてしまうのも良いかと思います。
matrixからmatrixの変換でも特に怒られないのでとりあえず変換をはさめば安心ではないかと。
np.asmatrix(A2) => matrix([[ 1, 4], [ 9, 16]]) np.asmatrix(B2) => matrix([[ 7, 10], [15, 22]])