バックナンバーはこちら。
https://www.simulationroom999.com/blog/stock-predict-matlabpython-backnumber/
はじめに
前回はMATLABによるFFT出力の周波数分布をローテーションを実施。
複素共役が0点を中心とした線対称になるように配置にすることはできた。
今回からはこれのPython(Numpy)版の話となる。
登場人物
博識フクロウのフクさん

イラスト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)によるベクトルのローテーション

まずは「Python(Numpy)によるベクトルのローテーション」だね。

Numpyにrollというメソッドがあるんで、これを使う。

これも罠があるんじゃ・・・。

まぁ罠はないというか、MATLABとは性格が違って、
自動で期待通りに合わせこんでくれちゃうって感じかなー。
実際にやってみる。

まぁ実際につかってみるか・・・。
>>> import numpy as np
>>> A=np.array([1,2,3,4,5])
>>> np.roll(A,3)
array([3, 4, 5, 1, 2])

お!
ちゃんと狙った通りローテーションするじゃん!

で、MATLABとの差ってのは何?
Numpyだとデフォルトで行ベクトルで、列ベクトルの場合は別の指定の仕方をするって感じ?

そもそも今、太郎くんが使ったのは行ベクトルじゃなくてベクトルだな。
Numpyはベクトルが3種類ある。
Numpyのベクトルの種類

ベクトルの種類?
ベクトルというと、
縦に並ぶ列ベクトル、横に並ぶ行ベクトルが思いつくけど、
もう1種類あるってこと?
今回は行ベクトルでやったつもりだったんだけど?

Numpyのベクトルは
- ベクトル
- 列ベクトル
- 行ベクトル
の3つがある。
今回は行ベクトルのつもりだったかもしれないが、最初の「ベクトル」に該当する。

具体的な差がわからん。

たぶん意味不明なのが一番最初の「ベクトル」だろうね。
こいつはベクトルではあるのだけど、行、列の概念がなく転置が効かない。
まぁベクトルというより数列って位置づけになっているのかもしれないけど。

とすると、列ベクトルと行ベクトルはどう書けば良いんだ?

こんな感じだな。
# 行ベクトル
>>> np.array([[1,2,3,4,5]])
array([[1, 2, 3, 4, 5]])
# 列ベクトル
>>> np.array([[1,2,3,4,5]]).T
array([[1],
[2],
[3],
[4],
[5]])

“[“、”]”がもう一個外側に増えた感じ?

そうそう。
この”[“、”]”が無いと行ベクトルと認識されず、転置をしていしても転置しない。

マジか。
試してみるか。
>>> np.array([1,2,3,4,5]).T
array([1, 2, 3, 4, 5])

あ、ホントだ!
転置されない!

ベクトルを単なる数列的に扱う場合はほとんど問題にはならないのだけど、
行列含めた演算をするときにハマり易い仕様だね。

そして、rollメソッドはベクトル、行ベクトル、列ベクトル、どれに大しても同じようにローテーションしてくれる。
これはベクトルと行列を分けた考え方をしているためだろう。

便利と言えば便利だけど、
知らないと、よくわからないところでハマりそう。

そうそう。
MATLABコードからPythonコード、または逆へ移植しようとしたときに散々悩まされたねー。

似ているが故に、ちょっと差があるとハマるってことだねー。
まとめ

まとめだよ。
- Python(Numpy)によるベクトルのローテーションをお試し。
- 無事ローテーション可能。
- Pythonはベクトルに種類がある。
- ベクトル。
- 転置等の行列由来の演算ができない。
- 行ベクトル。
- 列ベクトル。
- 行列演算を意識する際はベクトル以外の定義をする必要がある。
- ※ 今回は「ベクトル」でOK。
- ベクトル。
バックナンバーはこちら。
コメント