前の投稿 015 Pythonを使って動作検証用の測定データを作成するで紹介したPythonスクリプトの説明を行います.
$\sin\left(\pi t + \theta_{0}\right) + 2$
と,振幅1[V],位相30[deg],直流バイアス 2[V],時間は 5[s](2.5周期)の正弦波データを,10[ms]毎に合計501個生成するPythonスクリプトは,
ts = np.linspace(0, 5, 501)
xs = np.pi*ts + 30/180*np.pi
ys = np.sin(xs) + 2
です.
まず,時間の数列tsは,numpyパッケージのlinspace関数を使って生成します.
linspace関数は,
linspace(数列の最初の項, 最後の項, 数列の総数)
という引数を与え,numpy配列の数列データを生成します.
次の
xs = np.pi*ts + 30/360*np.pi
の行は,正弦波データの角度に関する数列データ(numpy配列)を生成しています.
np.piは円周率で,30/360*np.piは,30[deg]を[rad]に変換しています.
ここで特徴的なのは,
- numpy配列に定数(円周率np.pi)を掛け,定数(30/360*np.pi)を足すと,それが全ての項への演算として,新たなnumpy配列が生成されるということ
- numpy配列xsは,前もって,np.zero関数やnp.empty関数で確保しなくて良いこと(この場合は,代入ではなく,xsを生成しているので,前もって確保しなくて良い)
ことです.
以前の投稿 007 numpy配列の使い方で,numpy配列を,
「配列の生成手順が異なるだけで,配列としての使い方は,Pythonのリストと同じです.」
と紹介しましたが,実は,Pythonのリストでは,上記のような処理はできません(定数を掛けると,定数分だけリストが長くコピーされますし,定数を加算しようとするとエラーとなります).
numpy配列は,上記のように,(配列でありながら)あたかも変数であるかのように記述することができます(C/C++やC#のように,ループを使って配列の処理を行わずに済むので,ノンプログラマーでも,とっつきやすいと思います)
最後の
ys = np.sin(xs) + 2
の行も同じです.numpyパッケージが用意するsin関数は,numpy配列を引数として,全ての項のsinを算出して,numpy配列を生成します.さらに,全ての項に対して直流バイアス 2を加算した,最優的なnumpy配列ysが生成されます.
どうでしょう.numpyパッケージを使うことで,僅か3行で,しかも,非常に分かりやすい記述で,動作検証用の測定データを生成することができました.
C/C++やC#で同じ処理を行うには,少なくとも数十行は必要ですし,ノンプログラマーには分かりにくいプログラムコードとなると思います.
紹介が長くなったので,numpyパッケージと双璧をなす,matplotlibパッケージの紹介は,次の投稿にすることにします.
0 件のコメント:
コメントを投稿