とらりもんHOME  Index  Search  Changes  Login

とらりもん - python入門: 行列をいじってみよう! Diff

  • Added parts are displayed like this.
  • Deleted parts are displayed like this.

 計算機で数学的な処理をする場合, 多種・多量の数値を扱うことが多い。そういうときに役立つのが, 行列である。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])
とひとまとめにしてもよい。