numpy、SciPy、matplotlib

ikeuchihiroki2009-01-02

Pythonは科学計算にもよくつかわれるようだ。

科学者に必要なpythonモジュールはなにか
科学者のための Python 入門


とりあえず、Python本体に加えて以下のモジュールをインストールしてみる。

準備

Pythonインストーラーで簡単にインストールできる。最新はPython 3.0だが使いたいモジュールが対応していないので、Python 2.5.2を選ぶ。

次に、SetupToolsをインストールする。同じくインストーラーでインストールする。SetupToolsは、easy_installというモジュールのダウンロードからインストールまでを自動でするコマンドが含まれる。
SetupToolsインストール後に、PATHを通しておく必要がある。マイコンピューター右クリック→プロパティ→詳細設定→環境変数→PATHに「C:\Python25\Scripts;C:\Python25;」を追加する。

モジュールをインストール

  • numpy
  • SciPy
  • pyreadline

は、EXEのインストーラーでインストールする。easy_installの場合コンパイルが必要になるからだ。
pyreadlineはIPythonのサイトからダウンロードできる。

  • matplotlib
  • Python Image Library
  • IPython

は、easy_installでバイナリをダウンロード、インストールできた。
コマンドシェルにて

easy_install matplotlib
easy_install PIL
easy_install IPython

と入力する。

試してみる

コマンドシェルにて

ipython -pylab
import math,numpy,matplotlib,scipy
t=linspace(0,1,1024);
y=sin(2*pi*10*t);
plot(t,y)

title 'Sin Plot'
xlabel 'Time[s]'
ylabel 'Amplitude'

けっこう使えそうだ。
ScilabMatlabも)は、言語仕様が独特すぎてプログラムが読みにくい書きにくい印象があったが、Pythonならば可読性がよいプログラムが書けそうだ。

追記

http://www.enthought.com/に、科学計算に使うモジュール一式がある。必要に応じてサポート付きのライセンスもあるようだ。プロユースにも使えそう。

Pythonで連続ウェーブレット解析

swanという連続ウェーブレット解析のモジュールがあった。
swan-0.5.4a.tar.gzを試してみる。

必要なモジュール

Gtkは最新版2.12.9を入れた。
PyGtkはバイナリからインストール。

swanはアーカイブを展開して、

python setup.py install

とする。ただし、Windowsの場合はそのままではインストールできないので、
setup.cfgを以下のように書き換えてから実行する。

# very basic config

[install]
prefix=C:\Python25
optimize=2

インストール後にC:\Python25\Scriptsに「swan」というファイルができるので

move swan swan.py

としておく。

試す

2. Simple usageを見ながら

まずは信号をつくる。「ipython -pylab」で起動して

import math,numpy,scipy,matplotlib

Fs = 65.0
time  = arange(0,16,1/Fs)
signal = sin(2*pi*1.2*time) + cos(2*pi*3.7*time)
save('signal.dat', signal)

実行はコマンドプロンプトから

swan.py -s 65 signal.dat

として、Apply CWTを押すと実行される。

pycwtのみを使ったプログラム

swan: some visible examplesにあるように、GUIなしでプログラムを書いてもよい。

import pylab as p
import iwavelets.pycwt as w

Fs = 65.0
time  = p.arange(0,16,1/Fs)
signal = p.sin(2*p.pi*1.2*time) + p.cos(2*p.pi*3.7*time)

freqs=p.arange(0.1,5,0.025)
fc=1.5

r=w.cwt_f(signal,freqs,Fs,w.Morlet(fc))
rr=r.real**2+r.imag**2

p.imshow(p.flipud(rr),aspect='auto',extent=(time[0],time[-1],freqs[0],freqs[-1]))

p.xlabel('Time[s]')
p.ylabel('Frequency[Hz]')

p.show()

つかえそうだ。