Pythonで行列処理
かなり日にちが開いてしまいました
まわりの環境の変化がある季節だと思う
ということで、Pythonも少し離れていた
Rでお馴染みの行列処理、Pythonでもストレスなくできる
はじめてRを触ったとき、行列処理が快適でPerlやRubyにない魅力を感じた
そのころの感動とはいかないけど、結構、快適に使えます
行列操作
import numpy as np
行列(ndarrayクラス)
ここ、Rと違うところ、その1
np.int32とデータの宣言がいる
Rでは意識しなかったから少し戸惑う
x = np.array([[1,2,3],[4,5,6]],np.int32) #2x3の行列、np.int32で32bit整数に指定 print(x)
[[1 2 3]
[4 5 6]]
[tex: \displaystyle x= \begin{pmatrix} 1&2&3\ 4&5&6 \end{pmatrix} }]
print(type(x)) #オブジェクトの型を確認
<class 'numpy.ndarray'>
print(x.dtype) #オブジェクトの要素の型を確認
int32
print(x.shape) #オブジェクトのサイズを確認
(2, 3)
要素へのアクセス
x = np.array(range(8)) #array形式に変換 x = np.array([x,x+4,x+9],np.int32) #arrayの行列は[]で括る x
array([[ 0, 1, 2, 3, 4, 5, 6, 7],
[ 4, 5, 6, 7, 8, 9, 10, 11],
[ 9, 10, 11, 12, 13, 14, 15, 16]])
[tex: {\displaystyel x=\begin{pmatrix} 0&1&2&3&4&5&6&7\ 4&5&6&7&8&9&10&11\ 9&10&11&12&13&14&15&16 \end{pmatrix} }]
ここ、Rと違うところ、その2
要素へのアクセスはPerlやRubyと同じく0から始まるので注意
これってビットで考えているからなのか?
x[1,2] #2行目、3列目の要素、Pythonは要素が"0"から始まる
6
ここも気を付けるところ
行を指定するときはカンマがいらない
タイプする数が減るから早くコーディングできるのか?
いや、誤差かな
x[1] #2行目の全ての要素
array([ 4, 5, 6, 7, 8, 9, 10, 11])
ここ、列の全ての要素を出すとき、行も指定するのは忘れがち
Rだと列だけで良いのでミスしがち
x[0:,0] #1列目の全ての要素
array([0, 4, 9])
ここ、マイナスで行列の最後から呼び出せるのは便利
行列が大きいと数えるのが面倒なときがある
で、1行目、1列目が0で始まるけど、最後の行、列が-1なのは、0を起点に一つ下がると最後になるってことなのかな?
x[-1,2] #後ろから4行目、3列目の要素 # x[2,2]と同じ
11
x[-1,2] = 100 #行列の要素への値の代入 x
array([[ 0, 1, 2, 3, 4, 5, 6, 7],
[ 4, 5, 6, 7, 8, 9, 10, 11],
[ 9, 10, 100, 12, 13, 14, 15, 16]])
x+20 #要素は四則演算できる
array([[ 20, 21, 22, 23, 24, 25, 26, 27],
[ 24, 25, 26, 27, 28, 29, 30, 31],
[ 29, 30, 120, 32, 33, 34, 35, 36]])
a = np.array(range(8),np.int32) #行ベクトルを作成 x+a #列の長さが同じなら四則演算できる
array([[ 0, 2, 4, 6, 8, 10, 12, 14],
[ 4, 6, 8, 10, 12, 14, 16, 18],
[ 9, 11, 102, 15, 17, 19, 21, 23]])
b = np.array([[1],[2],[3]],np.int32) #列ベクトルを作成、各要素は[]で区切る x-b #列の長さが同じなら四則演算できる
array([[-1, 0, 1, 2, 3, 4, 5, 6],
[ 2, 3, 4, 5, 6, 7, 8, 9],
[ 6, 7, 97, 9, 10, 11, 12, 13]])