hirhirの日記

Pythonとデータ分析と人口知能

Python3 入門:線形代数 numpy 行列の計算

最近は線形代数pythonと共に合わせて勉強しなおしているので
ついでにPythonしてみようと思った

まずは行列

In [2]:
 
import numpy as np
a= np.array([[0.,-1.,4.],[5.,2.,-2.]])
b=np.array([[-2.,0.,-1.],[1.,-3.,2.]])
In [3]:
 
a
 
 
Out[3]:
array([[ 0., -1.,  4.],
       [ 5.,  2., -2.]])
In [4]:
 
b
 
 
Out[4]:
array([[-2.,  0., -1.],
       [ 1., -3.,  2.]])

まぁこんな感じで行列が表現できるようで。。。。

次は簡単な演算

In [7]:
 
2*b
 
 
Out[7]:
array([[-4.,  0., -2.],
       [ 2., -6.,  4.]])
In [8]:
 
a+b
 
 
Out[8]:
array([[-2., -1.,  3.],
       [ 6., -1.,  0.]])
In [9]:
 
a-b
 
 
Out[9]:
array([[ 2., -1.,  5.],
       [ 4.,  5., -4.]])

 

はいすこぶる簡単です。

Numpyすげぇ!!さて積は??

In [11]:
 
a= np.array([[3.,-4.],[-5.,1.],[2.,-2.]])
b=np.array([[-3.,1],[5.,-2.]])
 

 

In [12]:
 
a*b
 
 
 
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-12-8201c27d19b7> in <module>()
----> 1 a*b

ValueError: operands could not be broadcast together with shapes (3,2) (2,2) 

 できない。。。。

 ちょっと調べたら関数があったので試してみる。

In [13]:
 
a.dot(b)
 
 
Out[13]:
array([[-29.,  11.],
       [ 20.,  -7.],
       [-16.,   6.]])

 よかったできました。

どうやら*はnumpyでは対応する要素があってれば要素ごとの積を返すようだ

なのでshapeが違うと怒られる

最後に

逆行列

これは下記のようにimportを追加することで実現した

In [19]:
 
from numpy.linalg import inv
inv(b)
 
 
Out[19]:
array([[-2., -1.],
       [-5., -3.]])

bに対しての逆行列が取得できた

これなら線形代数の他の計算も楽になりそうな予感がする

今後面倒くさい時にはNumpyを使って楽にしてしまおう( ̄ー ̄)ニヤリ

ちなみに今回の参考図書はこちら

両方ともに良書と思っています。

やさしく解説してくれるので、私のような初学者にはおすすめです。