numpyとかscipyで引っかかったところ
ちなみに今言うのもなんですが、現在私は大学の学部4年生、卒業研究に取りくんでいます。いや、取り組んでいると言ってもあんまり進んでいない状態。
何をやっているかというと、音の信号をフィルタにかけてどーこーするというやつです。分野的には信号処理。微分やら積分がいっぱい出てきてちょっと混乱中です。データ構造に落とすことが出来れば、得意分野なのでいいのですが……。
で、我が研究室では基本的にMATLABという数値解析システム、もとい言語環境を使ってやるのですが、これがまたなんというか、プログラミングと言えばWebProgな私としては我慢ならない点が多いです。配列のインデックスが1から始まったり、for文がなんか遅かったり、関数なのか配列なのかが分からなくなったり。あとオブジェクト使えるの?って書こうとしたら、なんかあるみたいです。みんな使ってないだけで。
それもそのはずで、MATLABはプロトタイピング用の環境なんですね。もちろんGUIもウィジェットみたいなのがあって組めるには組めるのですが、常用するツールを作るのには向いていないというか。思いついたアルゴリズムやら処理を簡単に書いて試すという感じ。
あと、ゆくゆくは僕はこの研究の成果をWebブラウザ上で動かせるようにしたいと考えているので、サーバサイドで動かすことをあまり考えたくないMATLABさんでやるのもなんだか、と乗り気ではありませんでした。
そこでPythonですよ。困ったときのPythonちゃん。
さて、僕がこの研究をやるのに必要なものはただ一つ、強力な行列演算ライブラリです。行列式やら行列同士の積、和、それらをベクトルプロセッサのようにガバっとやるようなライブラリを欲していたのです。MATLABにはそれがあります。故に強力、いまだにデファクトスタンダードなんですね。MATLABとセットでよく使われるSimulinkというビジュアルプログラミング環境もなかなか強いですけれど。
Pythonにそれがあるのかというと、実はあるんです。行列演算ライブラリのnumpyと、それをさらに実用的に拡張したscipyです。行列演算をやるときにはCで書くのと同じぐらいの速度で動作するらしいです。こりゃ使うっきゃない。
というわけで使ってみたのでした。でも、いくつか引っかかった点があったので書いてみます。
numpy.ndarray()で.Tは使えない
ベクトル的に使うことも出来るっちゃ出来るんですけれど、例えば横ベクトル縦ベクトルという区別がある場合、そのまま使うことが出来ません。
ケースとしては後に別の行列との積を計算するベクトルがある場合、横であるか縦であるかで結果が変わってくるので、重要です。
横を縦に、もしくは縦を横にする場合は、転置という方法を使います。
MATLABではこんな感じ
A = 1:10; A_dash = A';
これで転置が出来ます。
numpyだとどうやるか。
import numpy as np A = np.arange(1, 11) A = A.T # これだとAがそのまま出る。つまりnumpy.ndarrayは転置の意味が無い A_mat = np.mat(A).T # 一旦numpy.mat()で行列に変換してそこから転置する。これなら縦ベクトルが出てくる。ただし、np.matはあんまり使わない方がいいらしい A_T = A[:, np.newaxis] # これでndarrayのままで縦ベクトルを出せる
とまあこんな感じです。
標準のrangeだと間隔が設定できないからarangeの配列をforに使う
そんなことも出来るんだーと思いました。
例えばMATLABだと
for i=0:3:100 i end
というように増分を3と簡単に決められたりするんですが、多分こういうことやるのってpythonだとリスト内包表記でやるんだろうなーって今思いつきました。よってこの項目はあんまり必要ないかも…。
実際はどうやったかというと、
for i in np.arange(0, 101, 3): print i
実はそれでも出来るんだーって思いました。まあ配列ですからね。当たり前かも
今のところこんな感じです。まだまだ使っていくのでいろいろTIPS的なことを発見したら書いてみます。