バックナンバーはこちら。
https://www.simulationroom999.com/blog/stock-predict-matlabpython-backnumber/
はじめに
前回は、MATLABのインデックス検索である、線形インデックス検索と論理インデックス検索の挙動を確認した。
かなり便利なアクセス方式で読み出しだけでなく、書き込みも可能。
そして、Python側も似たようなことができるか確認している。
登場人物
博識フクロウのフクさん
イラストACにて公開の「kino_k」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=iKciwKA9&area=1
エンジニア歴8年の太郎くん
イラストACにて公開の「しのみ」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=uCKphAW2&area=1
Python(Numpy)による論理インデックス検索と線形インデックス検索
前回、MATLABでやった論理インデックス検索と線形インデックス検索がPythonでもできるか。
ってところだねー。
まぁPythonというかNumpyだな。
通常のPython仕様だと論理インデックス検索、線形インデックス検索に相当するものはないな。
ベクトル、行列に関してはNumpyを使用すること前提なことろあるし、
それでも良いとは思うけど。
論理インデックス検索と線形インデックス検索の実施コードとその結果
これも、コードを見てしまった方が早いだろう。
>>> import numpy as np
# 数列生成
>>> A=np.arange(11,20)
# 3x3の正方行列化
>>> A=np.reshape(A,(3,3))
>>> A
array([[11, 12, 13],
[14, 15, 16],
[17, 18, 19]])
# 線形インデックス検索
>>> A[[0, 0, 1],[0, 1, 1]]
array([11, 12, 15])
# 論理インデックス作成
>>> B=(11<A) & (A<16)
>>> B
array([[False, True, True],
[ True, True, False],
[False, False, False]])
# 論理インデックス検索
>>> A[B]
array([12, 13, 14, 15])
コードとその結果を見て
結論としてはNumpyもMATLABと同じことはできるってことだね。
ただ、線形インデックス検索の性質が異なるな。
そこは僕も気になった。
MATLABの場合はベクトルでも行列でも先頭からのオフセットを入れればOKだったけど、
Numpyの場合は、キッチリ行と列をそれぞれ指定しないとダメっぽいね。
そうだね。
MATLABと似たようなアクセスをしたい場合は、以下のように書くと行列からベクトルになるんで、近似の書き方が可能になるはずだ。
>>> A=np.reshape(A,-1)
>>> A[[0,3,4]]
array([11, 14, 15])
あ、そういえば、MATLABは1オリジン、Pythonは0オリジンだから、
その点も注意だね。
そうそう。
ここら辺も合わせてくれると移植時に楽できるんだけどねー。
まぁ大元の言語仕様が違うから仕方ないことなのだろう。
まとめ
まとめだよ。
- Python(Numpy)による論理インデックス検索と線形インデックス検索が可能か確認。
- 一応、可能そう。
- ただし、行列に対する線形インデックス検索はちゃんと行と列を指定する必要あり。
- MATLABと同様にするにはrehapeでベクトルに直す必要がある。
- あと、MATLABは1オリジン、Pythonは0オリジンな点も注意。
バックナンバーはこちら。
コメント