とらりもんHOME  Index  Search  Changes  Login

python入門: 13. 行列をいじってみよう!

 計算機で数学的な処理をする場合, 多種・多量の数値を扱うことが多い。そういうときに役立つのが, 行列である。python(特にnumpyモジュール)は, 行列処理が大変に得意である。

リストで行列をいじるのはイケてない(泣)

 行列とは, 数を格子状に並べたものである。pythonでは, リストを利用すればそれを表現できる。たとえば(pythonシェルで),

A=[[1,2],[3,4]]

とすれば, 2行2列の行列ができる。その各成分は,

A[0][0]
A[1][0]
A[0][1]
A[1][1]

などで取り出すことができる(成分の添字は1からでなく0から始まることに注意!)

ところが, このようなリストは, 行列のスカラー倍や行列どうしの足し算などができない。例えば,

2*A

とすると, 各成分が2倍されてほしいのに,

[[1, 2], [3, 4], [1, 2], [3, 4]]

のように, なんか変な成分のリストができてしまう。要するに, 行列を扱うのに, リストは役に立たないのである。

numpyで行列をいじる!!

 numpyを使えば, そういうのが楽にできる。やってみよう。まず, import numpy as npを打った上で, 以下を打とう:

A=np.array([[1,2],[3,4]])
A

なんか良い感じで2x2行列ができている!! このAは,

type(A)

でわかるように, numpy.ndarrayのインスタンスである。以後, 行列はnumpy.ndarrayのインスタンスとして作るのが賢いのだ, ということを見ていこう。

まずこれをスカラー倍をしてみよう:

2*A

すると, 各成分がうまく2倍された行列ができる!! スバラシイ... 行列どうしの足し算はどうだろう?

B=np.array([[10,10],[100,100]])
A+B

すると, 2つの2x2行列の和A+Bが, ちゃんと(成分ごとの和として)計算される。

ところが, これらの行列どうしの積は...

A*B

すると, 各成分どうしが掛け算された結果が出る(泣)。これは「行列の積」ではない。行列の積は, 片方の行ベクトルと片方の列ベクトルの内積からなるのだった。そういう計算は, こうやればできる:

np.dot(A, B)      # 積AB
np.dot(B, A)      # 積BA

ABとBAの結果が違うこと(行列の積だから当然!)も含めて, ちゃんと計算できていることがわかる。

特殊な行列を作るnumpyのコマンド

 行列を作る(定義する)には, 当たり前だが, 各成分を明示的に与える必要がある。しかし, シンプルな行列, たとえば零行列や「成分がぜんぶ1の行列」などは, numpyのコマンドで簡単に作ることができる。それが, np.zeros, np.ones, np.identityなどのコマンドである。以下, 打ってみよう:

np.zeros([3, 4])
np.ones([4, 6])
np.identity(5)

最初のは3x4の零行列, 2番めは4x6の「成分が全部1の行列」, 最後のは5次の単位行列である。

数ベクトルも行列の一種だから, 例えば「成分が全部1の10次元の数ベクトル」は以下のようにできる:

np.ones(10)

数ベクトルを「折りたたんで」行列を作ることもできる。たとえば,

x=np.arange(0,12)

と打てば, xは0から11までの整数値が入った12次元の数ベクトルができる(print(x)と打って確認せよ)が, それに続いて,

A=np.reshape(x, [3, 4])

とすれば, 0から11までの整数が左上から右上, 折り返し, ..., 右下という順番で並んだ3x4行列ができる(print(A)と打って確認せよ)。もちろんこの2つの命令は,

A=np.reshape(np.arange(0,12), [3, 4])

とひとまとめにしてもよい。

Last modified:2020/01/31 12:07:15
Keyword(s):
References:[python入門]