日々のつれづれ

不惑をむかえ戸惑いを隠せない男性の独り言

Pythonで行列処理

かなり日にちが開いてしまいました
まわりの環境の変化がある季節だと思う

ということで、Pythonも少し離れていた

Rでお馴染みの行列処理、Pythonでもストレスなくできる
はじめてRを触ったとき、行列処理が快適でPerlRubyにない魅力を感じた
そのころの感動とはいかないけど、結構、快適に使えます

行列操作

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 要素へのアクセスはPerlRubyと同じく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]])