16. NumPyでベクトル・行列計算

NumPyでのベクトル、行列の作成方法(ゼロ・単位・逆・転置行列など)

更新日:

NumPyにおいて、arrayによりndarray型の配列を作成することができます。1次元の配列をベクトル、2次元の配列を行列として扱うことができます。

 

著書紹介(清水 義孝)

好評発売中!!

NumPyでのベクトル、行列の作成方法

まずはベクトル(1次元配列)を作成してみましょう。arrayに対してベクトルの要素の値「11,12,13」を渡します。

In [1]: arr1 = np.array([11,12,13])
...: arr1
Out[1]: array([11, 12, 13])

 

このようにNumPyで作成されたndarray型の配列は、リスト(list)とは異なり、ベクトルとして計算することができます。例えば、 もう1つのベクトルarr2を定義し、先ほど定義したarr1に対して足し算してみます。

In [2]: arr2 = np.array([21,22,23])
...: arr1 + arr2
Out[2]: array([32, 34, 36])
[11,12,13] + [21,22,23] = [32, 34, 36]と正しく足し算されていることがわかります。

 

一方で、同様の計算をリスト(list)で行うと、

In [3]: arr1 = [11,12,13] ...: arr2 = [21,22,23] ...: arr1 + arr2
Out[3]: [11, 12, 13, 21, 22, 23]
[11,12,13]の後に[21,22,23]が足されてしまい、正しく計算されませんでした。これは後らか説明する行列にも同じことが当てはまります。ということで、ベクトル、行列の計算を効率的に行うには、NumPyを利用してndarray型の配列を定義することが必要になります。

 

次に行列(2次元配列)を作成します。2行4列の行列(2×4行列)の作成方法は以下です。arrayに対して1行目「11,12,13,14」2行目「21,22,23,24」の値を渡します。

In [4]: arr3 = np.array([[11,12,13,14],[21,22,23,24]])
...: arr3
Out[4]: array([[11, 12, 13, 14],
                      [21, 22, 23, 24]])

arr3の内容を確認すると、array型で値が格納されていることがわかります。

 

またshapeにて配列のサイズを確認することができます。「(2, 4)」2行4列と表示されました。

In [5]: arr3.shape
Out[5]: Out: (2, 4)

 

dtypeでは配列のデータ型を確認することができます。「int32」整数型と表示されました。

In [6]: arr3.dtype
Out[6]: dtype('int32')

 

 

著書紹介(清水 義孝)

好評発売中!!

0(ゼロ)行列の作成方法

その要素が全て0の配列の作成には、zerosを利用します。引数には作成したい配列の形式を渡します。1次元配列の場合はint型の数値を、2次元以上の配列はタプル型で渡します。

例えば、要素が全て0である1×4の配列の作成は、以下のようにzerosへ引数4を渡します。

In [7]: np.zeros(4)
Out[7]: array([ 0., 0., 0., 0.])

 

数学において、その要素が全て0の行列を0(ゼロ)行列と言います。要素が全て0である3×4行列の作成は、引数として(3, 4)というようにタプル型で渡します。

In [8]: np.zeros((3,4))
Out[8]: array([[ 0., 0., 0., 0.],
                      [ 0., 0., 0., 0.],
                      [ 0., 0., 0., 0.]])

 

 

著書紹介(清水 義孝)

好評発売中!!

全ての要素が1の配列の作成方法

要素が全て0の配列を作成するには、onesを使います。引数として渡す内容は、先ほどのzerosと同じです。3×4行列の作成は、引数として(3, 4)というようにタプル型で渡します。

In [9]: np.ones((3,4))
Out[9]: array([[ 1., 1., 1., 1.],
                      [ 1., 1., 1., 1.],
                      [ 1., 1., 1., 1.]])

 

 

単位行列の作成方法

単位行列は、対角線の要素が1でそれ以外の要素が0の正方行列(行要素の数と列要素の数が一致する行列)を単位行列といい E で表します。単位行列の作成には、eyeを利用します。行要素の数と列要素の数が同じですので、引数には整数型の数値を渡します。

 

例えば、2×2の単位行列を作成するには、次のようにeyeへ引数2を渡します。

In [10]: E = np.eye(2)
....: E
Out[10]: array([[ 1., 0.],
                        [ 0., 1.]])

 

単位行列の性質として、任意の行列 A について AE=EA=A となります。任意の行列Aを定義して、実際にAE = A となるか確認してみましょう。

まずは行列Aを定義します。

In [11]: A = np.array([[2,-1],[-3,4]])
....: A
Out[11]: array([[ 2, -1],
                        [-3, 4]])

 

次に AE = Aとなることを確認します。行列の積AEは、後の行列の四則演算の章で詳しく説明しますが、dotを使って以下のように記述します。

In [12]: np.dot(A,E)
Out[12]: array([[ 2., -1.],
                        [-3., 4.]])

表示された結果より、行列の積AEは行列Aと同じということがわかりました。
 
 

著書紹介(清水 義孝)

好評発売中!!

逆行列の作成方法

各々の行列 A について AY=YA=E(単位行列) となる行列 Y を A の逆行列といい,A-1で表します。逆行列を求めるのがlinalg.invになります。linalg.invに対しては、逆行列を作成したい行列を引数として渡します。

 

それでは実際に逆行列を作成し、任意の行列Aに対してAY=YA=E(単位行列)が成立しているかを確認してみましょう。まずは2×2行列Aを定義します。

In [13]: A = np.array([[2,-1],[-3,4]])
....: A
Out[13]: array([[ 2, -1],
                        [-3, 4]])

次にlinalg.invに対して作成した行列Aを渡し、行列Aの逆行列Yを作成します。

In [14]: Y = np.linalg.inv(A)
....: Y
Out[14]: array([[ 0.8, 0.2],
                        [ 0.6, 0.4]])

これで行列Aとその逆行列Yが準備できましたので、AY=YA=E(単位行列)が成立しているかを確認してみましょう。まずは、AY=E(単位行列)となることを確認します。

In [15]: np.dot(A,Y)
Out[15]: array([[ 1., 0.],
                        [ 0., 1.]])

次にYA=E(単位行列)となることを確認します。

In [16]: np.dot(Y,A)
Out[16]: array([[ 1., 0.],
                        [ 0., 1.]])

いずれの結果もE(単位行列)となっていることが確認できました。

 

 

転置行列の作成方法

次の行列のように、行列Aに対して、対角線で成分を折り返した行列ATを転置行列と言います。Pythonでは、行列Aに対する転置行列はA.Tで求めることができます。

 

それでは例を見ていきましょう。まずは行列Aを作成します。

In [17]: A = np.array([[2,-1],[-3,4]])
....: A
Out[17]: array([[ 2, -1],
                        [-3, 4]])

次に行列Aに対する転置行列A.Tを求めると、

In [18]: A.T
Out[18]: array([[ 2, -3],
                        [-1, 4]])

行列Aの対角成分が入れ替わった転置行列が正しく作成されていることがわかりました。

 
 
著書の紹介です。

 

-16. NumPyでベクトル・行列計算

Copyright© AI-interのPython3入門 , 2019 All Rights Reserved.