粗大メモ置き場

個人用,たまーに来訪者を意識する雑記メモ

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]])

落ちたことのある罠集

外積が計算できない

np.crossは横長のベクトルをよこせとほざくので横長で渡す必要があります。
計算式を考えると見通し悪いですがそこは我慢するしかないのか…

行列とベクトルの積

np.arrayだとベクトルの転置とか気にせずうまいことやってくれるっぽいんですがとても不安。
サイズのミスマッチによる行列演算のミスに気づくなんていうのはmatlabあるあるですがこちらでは通用しません。
くわばらくわばら。