今回は、Numpyを利用して行列演算について考えてみたいと思います。
行列とは何かということを説明しろと言われたとき、C言語でいえば配列をイメージすれば良いと説明するのが簡単だと思っていました。
しかし、C言語で実装する配列は基本的に実際の行列の各種演算を行うことが直感的に出来ないと思います。
例えば、次のような行列A,Bがあったとします。
A=\left(\begin{matrix}
1&2 \\
3&4
\end{matrix}\right)
\ \ \ B=\left(\begin{matrix}
4&3 \\
2&1
\end{matrix}\right)
行列の演算は、基本的に加減算と乗算が行えます。除算は実質的に逆行列をかけるという考え方をすると乗算であると言えると思います。
例えば、この行列A,Bを足す場合、同じ位置にある数字同士を足せばよく、結果は次のようになります。
A+B=\left(\begin{matrix}
1+4&2+3\\
3+2&4+1
\end{matrix}\right)=
\left(\begin{matrix}
5&5\\
5&5
\end{matrix}\right)
これだけ単純なたし算を行うにしてもC言語では次のように長いコードを書く必要があります。
#include<stdio.h>
int main(void){
int a[2][2]={{1,2},{3,4}};
int b[2][2]={{4,3},{2,1}};
int c[2][2];
int i,j;
for(i=0;i<2;i++){
for(j=0;j<2;j++){
c[i][j]=a[i][j]+b[i][j];
}
}
}
これだけまどろっこしいコードを書くのがとても嫌な人にとっては、pythonのNumpyはとても素晴らしいツールであるとおもいます。同じことをするために、pythonでは以下のようにとても短く書くことができます。
import numpy as np
a=np.array([[1,2],[3,4]])
b=np.array([[4,3],[2,1]])
c=a+b
どうですか?まだpythonを使ったことがない人からすれば、とても短くかけていると思いませんか?
また、Numpyが優れている点として、行列のかけ算を行えるということです。行列の掛け算は、条件がそろえば行うことができ、2行2列の行列のかけ算では次のように計算します。
A\times B=\left(\begin{matrix}
A_1&A_2\\
A_3&A_4
\end{matrix}\right)\times
\left(\begin{matrix}
B_1&B_2\\
B_3&B_4
\end{matrix}\right)=
\left(\begin{matrix}
A_1B_1+A_2B_3&A_1B_2+A_2B_4\\
A_3B_1+A_4B_3&A_3B_2+A_4B_4
\end{matrix}\right)
これをCで実装すると、とてもめんどくさいと思います。(ここではコードは省略します!)
これをpythonで実装すると、次のようになり、とてもシンプルです。
import numpy as np
a=np.array([[1,2],[3,4]])
b=np.array([[4,3],[2,1]])
c=np.dot(a,b)
今回、とても基本的な内容について書きましたが、結論言いたい事は、より直感的に行列演算をする事がpythonでは行いやすいということです。
ぜひ、初めてプログラミングする人で行列演算を行ってみたいひとはpython,Numpyを使ってみてください。