Snow leopardにNumpy,Scipy,Pylabをインストール

重い腰を持ち上げて,すこしばかりPython導入に向けて進んでみた.
現在は研究ではOctaveをメインとしているので,それから移行できれば良いなと思っています.
とりあえずNumpy,Scipy,Pylabをインストールする.


Pythonの所在は,ターミナルで確認したところ,

hoge$ ls -l `which python`
-rwxr-xr-x  2 root  wheel  86000  6 25  2010 /usr/bin/python 

とでた.
多分,最初からSnow leopardに入っているものだと思われる.


"Superpack Installer" というSnow leopard用のインストールスクリプトを利用する.
Scipy Superpack for Mac OSXの中段あたりの,「Download Scipy Superpack Installer for OSX 10.6 (Updated 10 July 2011)」をダウンロードして適当なところに保存.
まったく手順通りに従う.
ターミナルで,

hoge$ sh superpack_10.6_2011.07.10.sh

を実行すると,

Would you like to install gFortran (required if not already installed)? (y/n)

と聞かれるので,"yes"と答えてみる.
gFortranのバイナリのダウンロードが始まる.
結構時間がかかる.
gFortranをインストール後,

Password:

とパスワードを尋ねられるので,rootのパスワードを入力.
あとは勝手にやってくれる.

Finished processing dependencies for DateUtils
Done
hoge$

と出ればインストール終了.


Pythonを起動して動作を確認する.
まず,ターミナルで "python" と入力して起動.

hoge$ python
Python 2.6.1 (r261:67515, Jun 24 2010, 21:47:49) 
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 



以下のようにしたが,どうやらテストできていない.

>>> import numpy
>>> numpy.test('1', '10')
nose.selector: INFO: **************.py is executable; skipped
.
.
.
nose.selector: INFO: **************.py is executable; skipped

----------------------------------------------------------------------
Ran 0 tests in 0.056s

OK
<nose.result.TextTestResult run=0 errors=0 failures=0>

scipy.test('1', '10')の結果も同じだった.
ググッた結果,

>>> numpy.test('1','10',extra_argv=['--exe'])
.
.
.
----------------------------------------------------------------------
Ran 3614 tests in 21.084s

FAILED (KNOWNFAIL=4, SKIP=2, failures=1)
<nose.result.TextTestResult run=3614 errors=0 failures=1>

とすれば,どうやらテストができているみたいだった.
ただし,

>>> scipy.test('1','10',extra_argv=['--exe'])

とすると途中でpythonが落ちる.よく分からない.


matplotlibを使ってみる.
次のスクリプトをpython.pyとして保存する.

# pylab_test.py
# -*- coding: utf-8 -*-

import pylab
import numpy
pylab.ion()

x = numpy.arange(0, 1, 0.001)
xn = numpy.array(x)*numpy.pi*2*2
y = numpy.sin(xn)
z = numpy.cos(xn)

print "Plotting SIN and COS functions"

pylab.plot(x, y, label="$\sin(x)$")
pylab.plot(x, z, label="$\cos(x)$")
pylab.xlabel("Time $x$ [sec]")
pylab.ylabel("Amplitude $y$")
pylab.legend()

pylab.savefig("test.eps") # output in EPS
pylab.savefig("test.png") # output in PNG

raw_input("Press ENTER KEY to exit")

実行してみる.

hoge$ python test_pylab.py
Plotting SIN and COS functions
Press ENTER KEY to exit (←Enterを押して終了)
hoge$

savefigで,カレントディレクトリに図が出力される.
ちなみにこれ.

LaTeXの数式が書けるのがよい.


最後にOctave*1と行列計算の速さを比べてみる.
比較に用いるマシンはMacBook Pro (Mid 2010, 2.66 GHz Intel Core 2 Duo, 4 GB DDR3) です.
Ocataveのスクリプト(benchm.m)は,

% benchm.m

num = 2000;
A = randn(num);
B = randn(num);

% 行列の積
tic;
M = A*B;
t = toc;
fprintf('Matrix product: %dx%d: %.3f\n', num, num, t);

% 逆行列
tic;
M = inv(M);
t = toc;
fprintf('Inverse matrix: %dx%d: %.3f\n', num, num, t);

こうなる.
Pythonのスクリプト(benchm.py)は,

# benchm.py

from numpy import *
from scipy import *
from pylab import *
import time

num = 2000

A = randn(num,num)
B = randn(num,num)
A = matrix(A)
B = matrix(B)

# 行列の積
start = time.clock()
M = A*B
end = time.clock()
print "Matrix product: %dx%d: %.3f" % (num, num, end - start)

# 逆行列
start = time.clock()
M = linalg.inv(M)
end = time.clock()
print "Inverse matrix: %dx%d: %.3f" % (num, num, end - start)

となる.
実行結果は,Octaveが,

Matrix product: 2000x2000: 1.161
Inverse matrix: 2000x2000: 1.925 

Pythonが,

Matrix product: 2000x2000: 2.660
Inverse matrix: 2000x2000: 4.075

となり,Octaveの勝ちという残念な結果に終わった.


iPythonも触ってみたけど,ほとんどMATLABじゃねぇかと思った.

*1:[http://octave.sourceforge.net/:title=Octave-Forge]で配布されているバイナリ