Translate

【初心者向け】python で座標データから角度を求める方法【numpy】

今回もpythonを使ったデータ解析の方法について紹介していこうと思います。

甘味もpythonを独学で勉強して、まだまだ初心者の域を出ることができませんがよろしくお願いいたします。

今回は、二次元の座標データ(縦、横)から角度を計算する処理をpythonを使って行って行きたいと思います。

こういったデータ解析の処理には、pythonのパッケージの一つである"numpy"というのが便利なので、こちらの導入も含めて紹介していきたいと思います。

pythonの角度のデータ処理にはnumpyが圧倒的便利


主にpythonをデータ解析などの用途で使用する場合には、numpyが圧倒的に便利です。

numpyとは、pythonの行列処理(いわゆるエクセルシートの行や列に対する計算処理など)を行うためのパッケージであり、便利なモジュール(特定の計算処理など)が含まれているので、とても便利です。


データ解析の領域でよく使われているプログラミング言語の種類としては、Matlabという言語が良く使われています。Matlabもいろいろなパッケージが入っていたり、チュートリアルやそれぞれのモジュールのサポートも充実しているので、便利なのですが、有料なのがネックです。

pythonだとnumpyを入れだけで同等のレベルのプログラミングやデータ解析を行うことができるので、手軽に使い捨てのようなスクリプトを作る場合には、pythonでも十分実践可能です。

まずはnumpyのインポートのコードを書く

pythonのデータ処理で便利なnumpyを使用するためには、はじめにコードの最初にインポートを行いnumpyを使えるようにする一行が必要になります。

具体的には何度も出てきてはいますが、下記のコードを入れるのが一般的です。


import numpy as np


コードのおおよその意味としては、「numpyというパッケージ(いろんなモジュールが入ったもの)を使えるようにします。numpyのコードを使うときには”np”という文字をつかいます。」といった内容になります。

次は実際にデータ解析をするcsvファイルを読み取る

numpyをインポートした後には、実際のデータ処理を行うために必要な生データが入ったcsvファイルを用意し、それをpython上で読みこませる処理が必要になります。

今回は、座標1のX軸(横軸)、Y軸(縦軸)のデータが一列目、二列目に入っていて、座標2のそれぞれのデータが三列目、四列目に入っているcsvデータを想定します。名前は仮に”data.csv”とします。

csvファイルを読み取り、それぞれのデータ列の定義を行ったところまでのコードの例がこちらになります。

import numpy as np
data = np.genfromtxt("data.csv", delimiter = ",")
x1 = data[:,0]
y1 = data[:,1]

x2 = data[:,2]
y2 = data[:,3]


こちらのコードで早速登場しているnp.genfromtxt()は、numpyのモジュールの一つです。np.genfromtxt()は欠損値のあるcsvデータにも対応しているので便利です。

ここまでのコードでそれぞれの座標のX軸、Y軸のデータが含まれたことになります。これらそれぞれの座標データを計算処理することで角度を出す処理に移っていきます。

座標データの角度計算には、tan(タンジェント)を用いる

二つの座標を結ぶ線が軸に対して形成する角度を算出する上では、三角関数のtan(タンジェント)を使うことが重要になります。

二つの座標によって計算されたtanの実際の値を処理すると角度に直すことが出来ます。これをtanの逆関数(文系の甘味が書いているので厳密ではありません)といいます。

そのため、これからの処理としてはそれぞれの座標のデータからtanを求める処理を行っていきます。

実際のコードの例はこちらになります。

import numpy as np
data = np.genfromtxt("data.csv", delimiter = ",")
x1 = data[:,0]
y1 = data[:,1]

x2 = data[:,2]
y2 = data[:,3]

x3 = x1-x2
y3 = y1-y2

tan = y3/x3


tanを求めるためには、それぞれの座標のX成分、Y成分それぞれの差分を求めることが必要になります。

ここからさらにtan の逆関数を求める処理を行っていきます。

import numpy as np
data = np.genfromtxt("data.csv", delimiter = ",")
x1 = data[:,0]
y1 = data[:,1]

x2 = data[:,2]
y2 = data[:,3]

x3 = x1-x2
y3 = y1-y2

tan = y3/x3
atan = np.arctan(tan)*180/math.pi


最後の行の処理によって、タンジェントの逆関数すなわちatan(アークタンジェント)が求められます。ここでもnumpyのモジュールでアークタンジェントの値を計算するnp.arctan()が使われていますね。

またarctan()だけではラジアンの値になっており、我々のなじみの深い度数(いわゆる°)に変換する必要があり、末尾にはその計算式が追記されています。

ここまでの処理でようやく角度が度数として算出されます。

複数のcsvファイルでそれぞれの角度を求めたい場合には、前回紹介したループ回路の計算処理の箇所に、角度計算用の計算処理を書き換えるだけでできるようになります。




角度データを閾値にして、データを分割して正規化する処理

角度データをうまく使う方法として、さらにpythonのnumpyとscipyを使ったものとして、タイトルの通り、角度データを一つの基準としてデータを分割して、データをそろえる方法があります。

大まかな手順としては、①角度データからデータを分割するための閾値(≒基準値)を決める、②基準値に則ってデータを二値化して、データを微分、そしてピーク値を求める、③ピーク値間でデータを分割して、リサンプルして正規化する、この処理をforループで一気にいこなうといったものになります。

これを行うことで、何試行かとった連続データであったとしても、試行毎にデータを分割して、データの大きさをそろえてデータをまとめることができます。