2014年10月 3日 (金)

今から始めるPython その6 numpyの基本 スライシングの続き

Numpy_logo1

前回は、J.R. Johanssonさんという方が作ったiPython notebookを一緒に読みながらNumpyアレイのスライシングの基本について見ていきましたが、長くなったので次回に続くといいつつ、長めの記事を書くのは時間がかかるので、なかなか更新できませんでした。

さて、今回はLinear algebraのところから見ていきます。

CとかJavaから来た人はForループでもって計算するのに慣れているので、Forループの代わりにできるだけ行列の計算に問題を置き換えて行くのが、パフォーマンスを得るコツです。

MATLABでもループばっかり使っている人は結構いるものです。しかしNumpyやMATLABは行列の演算に最適化されていることを思い出して、前回に覚えたスライシングをうまく使うことで、Forループが行列の演算に置き換えられる場合が多いので、NumpyではいかにForループを使わないかを心がけるといいと思います。それには上級者のコードを眺めて理解するのが近道ですね。MATLABならMATLAB Centralにいろいろとありますが、NumpyだとGitHubですね。

Scalar-array operations

さて、スカラーをアレイに対して足したり、掛けたりするとどうなるかについてですね。スカラーとはつまり数字が一つということで、配列じゃないということです。配列どうしの計算では、配列の次元が大事になってきます。

まあ、例にある通り、配列のすべての要素に同じ計算が行われています。つまり、Forループで各要素についていちいち計算しなくともいいわけですね。

掛け算、割り算、足し算、引き算すべて同じです。

Element-wise array-array operations

さて、上にも書きましたが、配列どうしの計算では、配列の次元が大事になってきます。

3x3の行列なら3x3の行列を用意してやれば、配列同士の掛け算、割り算、足し算、引き算が行われ、これはElement-wiseの計算になります。Element-wiseとは同じ位置にある数字同士で計算が行われることです。つまり、行列Aの右上の数字とは、行列Bの右上の数字とで計算するということです。

ここで、なんとなく高校・大学生時代の代数を思い出して、「n × m 行列 A と m × p 行列 B を掛け算すると結果はn × p 行列になるはずだし、結果の各要素は沢山の掛け算の足し算になるんじゃなかったっけ?」と変な感じがしたかもしれません。

こういう計算は、行列の乗法というやつで、次の項で説明されているMatrix multiplicationのことですね。

Matrix multiplication

上のn × p 行列はいわゆるドットプロダクトとも言います。なので、Numpyでn × m 行列 A と m × p 行列 BのMatrix multiplicationをするときは

np.dot(A, B)

のようにします。

実は、Numpyにはnp.arrayというよく使われるアレイの他にnp.matrixというのも用意されています。np.matrixを使うと行列の掛け算は代数のようにドットプロダクトがデフォルトの動作になって、np.dotと書かなくとも良くなります。

ぶっちゃけnp.matrixはあまり使われていないと思いますが、高度な代数を駆使したアルゴリズムをかくような場合は便利かもしれません。

私はnp.matrixを使ったことがありません。まあ、そんなのもあるんだという感じでいいと思います。

In [96]のところで、.Tを使っていますね。このピリオドは、英語ではこういう文脈では普通ドットと発音しますが、ドットを使うことでNumpyアレイが持っているメソッド(またはプロパティー、アトリビュートと言ったりもする)にアクセスすることが出来ます。

このTというのはメソッドで、transposeの略で、縦長な行列が横長になったりするアレです。同様のことはMATLABではアポストロフィーでもってA'としますね。ちなみにアポストロフィーも普通はプライムと発音します。アポストロフィーは多分通じません。

試しに

a = np.array([0])

としてNumpyアレイを作ります。これで、aはNumpyアレイのオブジェクトになります。

dir(a)

として、このオブジェクトが持っているメソッドを表示してみましょう。

アンダースコアがついたプライベートメソッドの他に、アンダースコアがないメソッドが沢山表示されたと思います。

'all', 'any', 'argmax', 'argmin', 'argpartition', 'argsort', 'astype', 'base', 'byteswap', 'choose', 'clip', 'compress', 'conj', 'conjugate', 'copy', 'ctypes', 'cumprod', 'cumsum', 'data', 'diagonal', 'dot', 'dtype', 'dump', 'dumps', 'fill', 'flags', 'flat', 'flatten', 'getfield', 'imag', 'item', 'itemset', 'itemsize', 'max', 'mean', 'min', 'nbytes', 'ndim', 'newbyteorder', 'nonzero', 'partition', 'prod', 'ptp', 'put', 'ravel', 'real', 'repeat', 'reshape', 'resize', 'round', 'searchsorted', 'setfield', 'setflags', 'shape', 'size', 'sort', 'squeeze', 'std', 'strides', 'sum', 'swapaxes', 'take', 'tofile', 'tolist', 'tostring', 'trace', 'transpose', 'var', 'view'

これらのメソッドは便利なのでよく使うものが多いです。たとえばこの中のsumはnp.sum(A)としてもA.sum()としても同じ動作になります。これは多分の全部のメソッドについて言えると思いますが、それぞれ対応するnumpyのファンクションがあり、ドットでアクセスできるメソッドはこれらに対するショートカットみたいなものです。

transposeのドットTについては

np.transpose(A)

という関数がA.Tという操作に対応します。

以下では、上でみたメソッドの中から代表的なものが説明されていきます。

Array/Matrix transformations

realとかimagとかabsとか、見たままですね。

Matrix computations

ここも、問題無いと思います。

Data processing

shape(data)

としていますが、ここでのdataはNumpyアレイです。これで、アレイの次元を調べることが出来ます。ここではpylab環境なのでnp.shapeの代わりにshapeとしています。

ただ、このshapeに関しては、

data.shape

のようにして、メソッドとしてアクセスする場合がほとんどだとおもいます。実は、これを見るまでnp.shapeという関数も用意されているのを知らなかったくらいです。

その後のmin、max、sum、stdなどもメソッドとして使う場合が多いです。

Computations on subsets of arrays

ここは、スライシングの基本をやったので余裕ですね。

面白いのは127行目の

monthly_mean = [mean(data[data[:,1] == month, 3]) for month in months]

の部分ですね。前回にちょっとだけ触れたリストコンプリヘンションをつかっているので、ちょっと複雑かもしれません。上の方でmonthsをnp.arangeでもって定義していますが、arange(1,13)の結果は1から12までの整数のベクターになります。13は最初のいらない数字なので入りません。なのでmonths (複数形に注意)は12の要素があります。これが、リストコンプリヘンションで一回目は1,二回目は2とForループのようにループして、12個の要素が入ったリストが結果です。

さて、それぞれのリストの要素はmean(data[data[:,1] == month, 3])になりますが、一回目のループを想定するとmonth(単数形に注意、monthsとは別の変数です)は1ですので、

mean(data[data[:,1] == 1, 3])

となります。meanはnp.meanのことです。np.meanにはaxisというオプションのパラメータがあって、平均を取るときの次元を指定できますが、ここでは省略されているので、全要素の平均になり、結果はひとつの数字になります。

ちょっと蛇足ですが、axisを使った場合の例を追加しておきます。

toy_data = np.arange(10).reshape(2,-1)
toy_data.mean(axis=1)
>>> array([ 2.,  7.])
toy_data.mean(axis=0)
>>> array([ 2.5,  3.5,  4.5,  5.5,  6.5])

np.arange(10).reshape(2,-1)で最初に0から9までの10要素のベクターを作って、すぐさまreshapeでもって最初の次元を2にして、次の次元は-1で自動で振り分けることで、2x5の2次元配列に変換しています。その上で、.mean(axis=1)とすることで、2つ目の次元(横方向)に対して平均をとっています。同様にmean(axis=0)では最初の次元(縦方向)に平均をとっています。出てくる結果の次元が異なるのに注意です。

次にデータのフォーマットを確認すると

The dataformat is: year, month, day, daily average temperature, low, high, location.

とありますので、data[:,1]の部分はmonthが入ったベクターになるようにスライシングしています。

で、スライシング(カギカッコの中)をよくみると

[data[:,1] == 1, 3]

ですが、スライシングの最初の次元はdata[:,1] == 1の条件を満たすベクターとなります。次の3はスライシングの2つ目の次元です。ベクターとスカラーがごっちゃなので混乱するかもしれませんが、スカラーは自動的に同じサイズのベクターとして解釈されます。

dataは二次元配列ですし、インデックスが3ということは4つ目のカラムなので(Numpyはゼロインデックスです)はdaily average temperatureですので、要は、1月の気温データをdataから抜き出して、平均気温を計算しています。

というわけでmonthly_meanには1月から順に12月までの平均気温が計算されています。短くエレガントに書いてあるので初心者にはちょっとキツいかもしれません。でも、慣れるとこういう風にかくようにすぐになると思いますよ。

その後はpylabを使ってプロットしています。

fig, ax = subplots()

に関しては、この場合プロットは一個しかないので省略してsubplots()にして、その後のax.barからaxの部分を省略して、bar、set_xlabelなどとしてもオーケーです。

でも、fig, ax = subplots()のようにすると複数個プロットがある場合、

fig2, ax2 = subplots()

のようにして、区別できるのでよい習慣だと思います。

subplots(複数形に注意)というのはsubplotとfigureを合わせたもので、あんまり使われているのを見ない気がします。普通はfig = figure()とやってからax = subplot(111)とかやって2行つかって書きます。

いやいやまた長くなってきました。全部終わるまで待っているとなかなか記事が進まないので、今日はここまでにして、次回Numpyの基本最終回として、Calculations with higher-dimensional dataから見ていきます。

次回からは公式サイトのPythonチュートリアルにもどって見ていくのがいいかなぁと予定しています。

続きを読む "今から始めるPython その6 numpyの基本 スライシングの続き" »

2014年8月 2日 (土)

今から始めるPython その5 文字列、リスト、numpyスライシング

さて、前回までにPythonの研究向けディストリビューションであるPython(x,y)をインストールし、付属するIDEであるSpyderをつかってpylabの仕組みを説明、ネームスペースについて触れました。

本ブログでは普通のチュートリアルではカヴァーされていないような初心者がつまづきそうなトピックにフォーカスしながらやっていきたいとおもっているので、今のところかなり変なPython入門シリーズになっています(とくにその3,4)。

さて、いよいよnumpyを使い始めていきます。numpyは高速な配列を提供するライブラリですが、これがなかったら私はPythonは使っていなかったとおもいます。それほど重要なライブラリです。

今回は、numpyを使うにあたって重要なスライシングについて見ていきます。

Pythonで文字列、リストのスライシング

シリーズのタイトルが「今から始めるPython」なので、一応Pythonの基本を見て、numpyアレイを扱うまでの基礎を見て行きましょう。

巷にPythonチュートリアルはたくさんありますが、Python公式のPython チュートリアルはとてもオススメです。私がPythonの基本を覚えたのも公式サイトのチュートリアルでした。

ただで読めるPython公式サイトの日本語チュートリアルがコスパと質のバランスでやっぱりいちばんいい気がしますので、これを一緒に見て行きましょう。

それではまず、3.1. Python を電卓として使うでPythonのインタプリタを計算機代わりにつかって、簡単な計算をしてみましょう。

まあ、3+5としたければ3+5と打てばいいという、とても当たりまえな内容で問題ないとおもいますが、剰余の計算が、MATLABだとmod(X,Y)みたいにして関数が必要なので、思わずPythonではどうやるんだっけと調べてしまうことがありますが、実はオペレーターがあって%だけでいいのが、ちょっと注意ですね。

5 % 3

とすると2が得られます。

あとは、

5/3

とすると答えがざっくり1になるのが驚いてしまうと思います。これは、もともとPythonではデータ型が保たれるような仕様であったため、Python 2系まではデフォルトでは整数同士の割り算は整数の答えになります。

MATLABから来た人は気持ち悪いし、初心者がびっくりする部分なのでPythonのバージョン3系ではちゃんと小数点のついたフロートのデータ型で答えが出るようになりました。でも、Python(x,y)をおすすめしている当ブログではPython2系をつかっていますので、整数型の答えがデフォルトです。しかし、この仕様は実は変えられるので、

from __future__ import division

と未来からのモジュールをインポートすると、先程の結果が、1.6666666666666667に変わります。私はこれ便利でよく使っています。

あとは、Pythonを起動してすぐでインポートが面倒なときは、

5/3.0

として、フロートの計算なのでフロートの結果になるようにしたりもします。

便利なのは、たまに割り算の結果の整数部だけ欲しいので、floor(5/3)なんてやることがあります。実はこれは、

5 // 3

としても同じことで、スラッシュが二重になると小数点が切り捨てになります。ちょっと便利ですね。

あとはMATLABだと階乗はハット(^)で2^10みたいにやったように記憶していますが、Pythonでは2**10のようにアスタリスクを二重にします。

あとはMATLABのansに相当するのがアンダースコア(_)で、計算機代わりに使うときは割りと便利ですね。

3.1.2. 文字列のところは、文字列のスライスのあたりまでnumpyにはあまり関係ないので説明は飛ばしますが、難しくないのでざっと読むといいと思います。"hellow" * 3とかで"hellowhellowhellow"になるのは結構斬新です。

ここで、スライスの考え方はMATLABから来たらほぼ同じなのですんなり行くと思いますが、多少違いもあるので、気をつけましょう。

word = 'Python'

として、word[0]でPにアクセスできるからわかるようにPythonではインデックスは0から始まります。MATLABは1からだったりするのでややこしいですね。

で、重要なのは

word[-1]

ですね。MATLABだとword[end-1]みたいに書くところが、endがない形でスッキリみえるけども、ひと目で初心者が分かりやすいコードはMATLABの方ですね。私はnumpyに慣れたので、スッキリしていいと思います。

word[2:5]

のように、部分的にスライスしたり、

word[2:]

のように、こっから全部という風にかけたり、

word[2::2]

ステップサイズを2に指定したりと出来ます。MATLABだとインデックスがずれて、[3:2:end]という感じでしょうか(もうMATLAB忘れている)。

このスライスはnumpyでも全く同じなので、覚えましょう。これを多次元に拡張するとnumpyのスライスになります。

3.1.3. Unicode 文字列は飛ばします。今はざっと読んでください。

3.1.4. リスト さあ、いよいよリストです。リストは、MATLABでいうCELLみたいな感じですが、リストのほうがめちゃ便利です。Pythonにはあとはタプルとディクショナリがありますが、リストが一番よく使うもので、リストを覚えたらタプルは簡単です。

リストも文字列のときと同じようにスライスが出来ます。

squares = [1, 4, 9, 16, 25]

squares[-3:]

とすると最後から3つをスライスして、

[9, 16, 25]

という結果になります。

意外と忘れるのが、リストを繋げる操作(コンカテネーション)です。リストは実は+オペレーターであっさりとつなげられます。

なので、

squares + [36, 49, 64, 81, 100]

とすると

[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

という結果になります。

なんでこれが忘れがちになるかというと、リストの後ろに要素を増やそうとするときには、普通appendを使うからです。

ちょっとSpyderなどのコンソール上で、

print dir(list)

としてみるとアンダースコアが付いたものの他に

'append', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort'

というのが出てきます。ここでのlistはグローバルスコープにあるリストのタイプを規定しているオブジェクトで、dirでもってリストが持っているメソッドを表示させているわけです。

a = []

または

a = list()

として変数aを初期化したリストにして、

a.append(3)

とするとaの中身が[3]になります。

こういう感じに最後に要素を継ぎ足していくときに使うappendはむっちゃ使いますので、発想としてはさっきのsquares + [36, 49, 64, 81, 100]をしようと思うより先に

squares.append([36, 49, 64, 81, 100])

としてしまいたくなるわけですが、これだと結果が違って

[1, 4, 9, 16, 25, [36, 49, 64, 81, 100]]

となってしまいます。 リストはCELLのようにいろんなオブジェクトを要素として持てるので、リストの中にリストというのも可能なんですね。で、appendしたときに渡すものは一要素として追加されるので、上の様に6番目の要素はリストとしてひとまとまりで入ってしまうわけです。

どうしてもappendでやろうとおもったら一つ一つ追加する必要があるので

for element in [36, 49, 64, 81, 100]:
    squares.append(element)

という形になります。これは、フォーループですが、PythonではMATLABのようにendは使いません。その代わりループする内容のまとまりを表すのにインデンテーションを使います。インデンテーションとは、左側のスペースのことです。普通はタブか、スペースを4つつかいます。これが同一ブロックでスペースか一つでもずれるとエラーになるという、非常に厳しいルールです。多少窮屈ですが、このルールのおかげで他人が書いたコードを読むときにスラスラ読めてしまう効果を実感すると、利点の方が大きいことがすぐ理解できると思います。

リストには文字列やタプル、ディクショナリ、関数、クラスオブジェクト、などなどなんでも格納出来ます。

numpy超基本その1

さて、ながなかと準備してきましたが、いよいよnumpyを見ていきます。

MATLABから来た人はぜひ、NumPy for MATLAB usersというチートシートを活用しましょう。

Numpyの基本については、個人的に良くまとまっていると思った、J.R. Johanssonさんという方が作ったiPython notebookが参考になるので、これを一緒に見て行きましょう。

まず、

%pylab inline

としていますが、これはIPythonのマジック(特別機能)である%ランチャー機能をつかっています。我々はインタプリタにはIPythonではなくSpyderを使っている前提なので、かわりに

from pylab import *

の呪文を唱えましょう。基本的に同じことがおこります。

つぎに、

from numpy import *

としていますが、これはpylabと同じネームスペースですね。はっきりいって、上でpylabを呼んでいるので、必要ないのですが、まあ害はありません。

pylabのネームスペースは、トップレベルにnumpyとmatplotlibの関数をもってくるので、気持ち悪い人は気持ち悪いかもしれません。pylabはさらにnumpyをnpのネームスペースにもインポートします。numpyは普通 import numy as npとして使われるのでそのスタイルに慣れている人向けですね。

pylabはインタラクティブな解析でMATLAB代わりにするならタイピングが少ないのでいいと思いますが、長いプログラミングを書くときはPylabじゃなくmatplotlibからpyplotを掘り出して来て使ってネームスペースを分けるのが普通です。

そして、リストを渡してnumpy arrayをつくり、dtypeやsize、shapeを説明しています。このへんは簡単ですね。

注意すべきは

M[0,0] = "hello"

でエラーになっていることですね。これは、numpy arrayはリストとはちがって同じデータタイプのものしか入れられないという重要な制限があるからなんですね。これは、numpy arrayのメモリ上のレイアウトを最適化し、必要最小のメモリー領域をつかい、最小のオーバーヘッドでもってアレイの要素にアクセスするための仕様なのです。numpyの速さの秘密の一つです。

なので、たとえば自分のデータが0から255までの整数しかないとわかっている場合は、numpy arrayのデータタイプとして最適なnumpy.uint8を選んでやると一番パフォーマンスがでます。なんだかC言語をやっているみたいですね。

データタイプはアレイを作るときに

M = array([[1, 2], [3, 4]], dtype=np.uint8)

のように指定できます。我々はpylab環境にいるのでnpを省いて

M = array([[1, 2], [3, 4]], dtype=uint8)

でもオッケーです。ちなみにarray自体もnumpy.arrayのことですが、pylabがトップレベルにインポートしているのでnumpyを省いてもかけますし、np.arrayにもエイリアスがあるので、これでも同じです。

さらには、

M = array([[1, 2], [3, 4]], dtype='uint8')

のようにクォーテーションでくくってもよく、これはpylabでなくってもオッケーです。私はいつもnp.uint8ですが、この辺りは好みです。

さて、このMを浮動小数点型にしたいとおもったら

M = M.astype(np.float)
M = M.astype(float)
M = M.astype(np.float32)

などとして、データタイプのキャストができます。

そして、arangeやlinspaceですね。linspaceはMATLABでおなじみですね。x = arange(0, 10, 1) でarangeに渡している2番めのパラメータ10は最初のいらない要素を意味するので、0から9までを1刻みでとったアレイになるんですが、これはnumpyアレイのスライスと同じと覚えるといいと思います。あと、3つめのパラメータは省くと1になるのでこの場合省けます。

さっきの

squares = [1, 4, 9, 16, 25]

をつかってnumpyアレイaを作ってみましょう。

a = array(squares)

ここで、a[:2]とすると2は最初のいらない要素のインデックスなので、欲しいのは0,1になって、結果は

array([1, 4])

となるのですね。arangeはnumpyならではの関数なのでpython/numpyのインデックスを踏襲しているわけです。でも、linspaceはおそらくMATLABとの互換性を高めるためにつくられたかなり機能のかぶっている関数なので、動作がMATLABの様になっているわけです。

その後はざっとながして、次に便利なのは

M.nbytes

ですね。これで配列のメモリ上の大きさがバイトで分かります。MATLABではwhosというコマンドがあってよく使っていたと思いますが、numpyにはwhosみたいなのはないです。勘違いnp.who()というそっくりなコマンドがありました。pylab環境ならwho()です。whosだとそんなのないと怒られるので、随分の間ないものと思っていた。。。

numpyアレイに関してはwho()が一番いいですが、listやdictは表示されませんので、Pythonにもglobalsという関数をつかってグローバルなスコープにある関数・変数をディクショナリとして返してくれますが、ちょっと情報量多すぎで、必要な情報を探すにはフィルターしないと大変です。例えばディクショナリだけ表示とか

[ k for k,v in globals().items() if type(v) == dict ]

またはリストだけ表示なら

[ k for k,v in globals().items() if type(v) == list ]

とできます。

もしくは'A'で終わる変数名だけなら

[ k for k,g in globals().items() if k.endswith('A') ]

とかです。

Spyderにはオブジェクトヴュアーがあってwhosの代わりになります。また、IPythonにはwhosがあったりします。IPythonは便利なのは便利ですが、Python初心者には混乱するかもしれないので、まだ説明してませんが、慣れた頃にぜひ試してみるべきツールです。

さあ、とうとうインデックシングのところまできました。リストと文字列のスライスの説明をしてきたので、かなり分かりやすいとおもいます。Fancy indexingがMATLABから来た人なら当然のことですが、そうでないと咀嚼するのに時間がかかりますね。

66行目に

[n for n in range(5)]

とありますが、これはリストコンプリヘンションというもので、とっても便利です。これは、ちゃんとした説明の記事が必要なくらい重要なテクニックなので、ここでは簡単にフォーループに読み替えたときに出てくる要素がリストの中身になるような感じと思ってもらえばOKです。ここではrangeというPythonのビルトイン関数をつかって0から4までの要素のリストを作っています。

ただし、

array(range(5))

とやってもarray([n for n in range(5)])と同じ結果が得られるので、リストコンプリヘンションを使う意味があまりありません。(突っ込んでばかりですみません。。)

同じことをするなら、おすすめはNumpyのarangeを使って

B = arange(5)

で、結果は同じです。(pylabはトップレベルとnpにnumpyをインポートしているのでnp.arangeでもarangeだけでも同じ結果。)

リストコンプリヘンションの便利な使い方を一例だけ紹介しておくと、

[n for n in range(100) if n % 11 == 5]

なんてやると100までの整数で11で割った時のあまりが5になるような数を選んでリストを作れます。

次の、

row_mask = array([True, False, True, False, False])
B[row_mask]

のマスクの使い方はとても便利です。ぜひマスターしましょう。

応用としては、

B>3

とすると

array([False, False, False, False, True], dtype=bool)

という結果が得られるとおもいますが、これをつかって

B[B>3]

という風にするとアレイBの中から3より大きい要素を抜き出すことが簡単に出来ます。

array([4])

takeとかchooseって使ったことがない。Fancy indexingで十分な気がします。

さて、Linear algebraのところでたどり着きました。 これで大体半分消化しましたが、長くなったので、続きは次回 その6 numpyの基本 スライシングの続き にしましょう。

続きを読む "今から始めるPython その5 文字列、リスト、numpyスライシング" »

2014年7月26日 (土)

今から始めるPython その4 pylabネームスペースの解説

前回の「今から始めるPython その3 Site-Packagesってなに。モデュールのインストール・アンインストール」ではちょっと脱線して、モジュールのインストール・アンインストール関係に重要なSite-PackagesについてPython(x,y)を使う前提での注意点などを、解説しました。

今回は、流れを戻して「今から始めるPython その2 Spyderを使う」で使ったpylabの説明の続きをやります。

pylabの使い方は、このNicolas P. RougierさんのMatplotlib tutorialというチュートリアルが素晴らしいので、コードサンプルについては丸投げし、あまり初心者むけの解説がないと思われるpylabの魑魅魍魎としたネームスペースについて解説します。

MATLABとのネームスペースの違い

MATLABでは、関数を定義するときは、関数名と同じ名前のファイルを作って、そのファイルがある場所をパスに追加するか、そのフォルダへ移動しないと定義された関数が使えません。パスに追加してあれば、いつでも使えます。一つのファイルに、ファイル名と同じメインの関数の他にメインの関数が使うサブの関数を定義することはできますが、これはローカルなスコープの関数なので、サブの関数はユーザーには見えません。同じファイル中にあるメインの関数だけがサブの関数を使うことができます。

一方、PythonではMATLABと違い一つのファイルに色々な関数をまとめることが出来ます。

例えば、MyModule.pyというファイルをつくり、そこにfunctionAやfunctionBといった関数を定義したとしましょう。これをコンソール上や他のスクリプトから使うには、import文を使い

import MyModule

のようにMyModuleをインポートし、モジュール名と関数名をドットでつなげたMyModule.functionAのような感じでアクセスするのが普通です。モジュール名さえユニークな名前をつければ、その下にある関数はありがちな名前でもモジュール名との組み合わせはユニークなのでMATLABのようにユーザーが定義した関数がMATLABのオリジナルな関数を上書きしてしまったなんてことを簡単に解決できます。

関数を定義したファイルの置き場ですが、コンソール上では定義されたファイルと同じフォルダにos.chdirで移動すれば、インポートできます。また、スクリプトをファイルに書くときは、スクリプトファイルを関数が定義されたファイルと同じフォルダに置きます。

これだと複数の場所にあるスクリプトからインポートするのが大変なので、そういう場合はsite-packagesに置いておけば、どのフォルダにいるか関係なくインポートできます。

これは、効果としてはMATLABでパスを追加した様な感じです。ちなみに、インポートできるパスの範囲を一時的に変更するには

import sys

として、sysというスタンダードライブラリをインポートし、sys.path.appendでインポートしたい関数が書いてあるファイルへのパスをシステムに追加してやることで、importが追加されたパスからもできるようになります。

ネームスペースのおさらい

pylabはプロットするのに便利ですが、色々とてんこ盛りなので、全容を把握するのはかなりややこしいです。その2でネームスペースの解説をしましたが、結構なれるまでは難しいかもしれません。でも、たくさんのライブラリがあるPythonのような言語ではネームスペースはライブラリ名の衝突を避けるためのとても柔軟でスマートな解決法なので、もうちょっと詳しく見て行きましょう。

ウインドウズで、よく使うソフトウェアはショートカットをつくってデスクトップに置いたりしますね。Pythonのimport文はちょっとこれに似ています。

例えばpylabをインポートすると自動でインポートされるnumpyを例にあげて解説します。公式に推奨されているnumpyのインポートの仕方は

import numpy as np

です。インポート文はその3で解説したSite-Packagesにあるサードパーティ製のライブラリや、Pythonの標準ライブラリにあるモジュールやパッケージを使えるようにする文ですが、このようにas なになにとすることでショートカットのように好きなエイリアス(アダ名)をつけて呼べるようになります。

人によっては

import numpy as N

なんてする人もいますし、

import numpy

でそのままつかってもかまいません。

numpyアレイをつくろうと思った場合、それぞれ

data = np.array([1,2,3])
data = N.array([1,2,3])
data = numpy.array([1,2,3])

のようにして、numpyの関数・クラスにアクセスするわけです。

さて、pylabの標準的な使い方である、

from pylab import *

では、from文を使って、pylabの下にある関数・クラスをワンレベル掘り出していると「その2」の方でも解説しました。pylabはnumpyに依存するので、pylabを上の方法でインポートすると、自動的にnumpyもインポートされますが、これが実はトップレベルとnpネームスペースの両方で使えるような形でインポートされています。

pylabのソースコード(普通は、"C:\Python27\Lib\site-packages\matplotlib\pylab.py"にある)を見てもらうと

from numpy import *
from numpy.fft import *
from numpy.random import *
from numpy.linalg import *

from matplotlib.pyplot import *

# provide the recommended module abbrevs in the pylab namespace
import matplotlib.pyplot as plt
import numpy as np
import numpy.ma as ma

というセクションがありますが、はじめの4行で、numpyのいろいろな関数を掘り起こして、トップレベルでnumpyと書かなくとも使えるようにしています。このおかげでMATLABのような感じで使えるようになるのです。

例えばMATLABでゼロ行列をつくろうとおもったらzeros(2,2)のようにしますね。numpy.zerosという関数がこれに相当しますが、from numpy import *でトップレベルにzerosを持ってくることで、zeros((2,2))のようにして、MATLABでzeros(2,2)としたときに相当することができます。

ただし、多くの場合numpyの関数はnp.zerosのように使うのが普通なので、np.zerosでも同じ関数が使えるようにするために下の方で、import numpy as npも行われているのです。

このようにpylab環境下では、numpyはトップレベルとnpネームスペースの両方から使えるわけです。

例えばnumpy.fft.fftという関数は、fftだけても使えますし、np.fft.fftとしても使えます。先程のarrayもトップレベルにあるのでdata = array([1,2,3])でもdata = np.array([1,2,3])でもいいのです。便利ですが、ちょっと混乱しますね。

普通は二重にインポートするようなことは混乱の元なので、まずしないんですが、pylabの存在意義はMATLABから来た人が移行しやすい環境、タイピングのすくないインタラクティブにデータを解析するための環境を用意することなので、これはかなり特殊な例です。ちなみに二重にインポートしても、ショートカットをもう一個つくった感じなので、メモリーを二倍使ったわけではありません。

同様にpylab環境以外でmatplotlibをつかってプロットをするときはimport matplotlib.pyplot as pltとしてpyplotをpltというエイリアスで使うのが推奨されています。pylabではpyplotにある関数をfrom matplotlib.pyplot import *でトップレベルにもってきつつ、通常の使い方であるpltでも使えるようにimport matplotlib.pyplot as pltも行われています。

他にもいろいろなことがグチャグチャと行われているのがpylabですので、使う分には簡単で、便利ですが、全容を把握するが難しい所以がここにあります。わけが解んなくなったらば、一度ソースコードの最初の部分を眺めておくと中身でどんなライブラリがインポートされているのかがわかります。ドキュメンテーションを読むよりもこっちのほうが私にはわかりやすかったです。

長くなってきたので今回はこの辺で終わっておいて、次はいよいよ文字列、リスト、numpyのスライシングをマスターしてみましょう。

続きを読む "今から始めるPython その4 pylabネームスペースの解説" »

2014年3月17日 (月)

今から始めるPython その3 Site-Packagesってなに。モデュールのインストール・アンインストール

三回目になりました「今から始めるPython」です。前回までに、Python(x,y)をインストールして、同梱されるSpyderというIDEを使い始めました。

今回は、Pythonのライブラリの取り扱いについて書きます。ずっと前にPythonのパッケージ、モデュールのアンインストールというのを書きましたが、シリーズに合わせてもう少し丁寧に説明します。

モデュールとパッケージ

Pythonではライブラリはモデュールとかパッケージと呼ばれます。モデュールというのは一つのファイルで済むような小さな規模のライブラリによく使われ、大規模なライブラリはパッケージの形式を取ることがおおいです。同じフォルダに__init__.pyというファイルを置くと、パッケージ形式になるのですが、ユーザーにとっては使い方も違わないので、似たようなものです。初めは、どちらもライブラリのことだとわかれば十分です。

通常、ウィンドウズでPythonをインストールすると

C:\Python27\Lib\site-packages

というフォルダが見つかると思います。Python(x,y)でインストールしても同じです。

このsite-packagesというのが、サードパーティ製のライブラリの置き場です。ここにあるpyファイルやpydファイル、eggファイルなどがインポート可能なライブラリの本体になります。

Python(x,y)は以前は差分アップデート用のファイルも配っていたので、サポートされているすべてのライブラリを一気に最新版にアップデートできたのですが、最近は差分アップデートの配布が停止しています。ただ、個別のライブラリ用にプラグインアップデート用のファイルが配布されているので、最新版に保つにはこれをダウンロードして実行するだけです。このアップデート用ファイルは自動で古いバージョンを検出して、アンインストールしてからインストールするので、とても優秀です。

アップデート用ファイルはこちらからダウンロードできます。

Python(x,y)のプラグインインストーラーはとても優秀

その1にもちょっと書きましたが、Python(x,y)でインストールされたライブラリはSite-Packagesのプラグイン用のフォルダにuninstall.exeを置いてくれるので簡単に手動でアンインストールも出来ます。

これは当たり前のようで、意外にそうでもないのです。あえてPython(x,y)を使わないと、どういう状況かを、numpyを例にあげて説明しましょう。

numpyもそうですが、多くの有名なライブラリは中身がC言語でできているためCエクステンションライブラリと呼ばれます。なので、自分でソースコードからコンパイルしてインストールするのは結構大変な作業になり、普通は公式サイトにあるコンパイル済みのバイナリーのインストーラーを取ってくる事になります。

numpy公式サイトのインストーラーでのインストールはとっても簡単でダブルクリックして、画面の指示に従えば終わります。ただ、numpy公式サイトからのインストーラーにはuninstall.exeが含まれてないので、アンインストールが面倒なのでアップデートするときちょっと困るわけです。

基本的には手作業で、C:\Python27\Lib\site-packagesにある関連ファイルをすべて削除すれば大丈夫ですが、全部削除出来たか確認するのが手間です。numpyフォルダとnumpy-1.8.0-py2.7.egg-infoフォルダがあればこれも削除して終わりだと思いますが。。pthやeggファイルもある場合があるかもしれません。

このアップデートの問題を解決しようとpipというコマンドラインツールが作られました。これはpip install ライブラリ名というふうにやると欲しいライブラリをインストールしてくれ、pip install --upgrade ライブラリ名としてアップデート、pip uninstall ライブラリ名としてアンインストールしてくれるて大変便利なんですが、numpyの場合、pip install numpyとするとソースコードをダウンロードしてきてからこれをコンパイルしようとするので、Cコンパイラーの設定をちゃんとしていないとエラーに成ってしまうのです。

Python(x,y)がおすすめなのは、こういうコンパイルの難しいライブラリをインストールし、最新版に保つのが超簡単になるのが、最大の理由です。

PipとPyPI

Cheese StoreとかCheese Shopと呼ばれたりすることもあるthe Python Package Index略してPyPIは、Pythonライブラリのレポジトリーサイトで4000以上ものライブラリがあります。基本的にここにあるものはpipでインストールできます。PyPIに登録された名前がpip install ライブラリ名に使うライブラリ名です。Python(x,y)でサポートされていないものは出来るだけpipでインストールしましょう。そうするとアップデートやアンインストールが楽です。

もしpipがない環境の場合でも、PyPIからソースコードをダウンロードしてきて、解凍し、フォルダ内にあるsetup.pyというファイルがあるので、コンソール上からpython setup.py installとするとインストールできます。ただし、これやるとアンインストールがまた面倒いので、python setup.py build してからpython setup.py bdist_wininst としてウィンドウズのインストーラーを作ってしまうと、コントロールパネル経由でアンインストールできるようになります。

では、最後にPythonの名前の元になったコメディ、「モンティ・パイソン」のチーズショップをお送りして締めましょう。PyPIがCheese Shopと呼ばれるのもここから来ています。

うーむ、まあ面白いが、微妙。似たようなではParrotの方が面白い。

続きを読む "今から始めるPython その3 Site-Packagesってなに。モデュールのインストール・アンインストール" »

2014年3月11日 (火)

今から始めるPython その2 Spyderを使う

前回(今から始めるPython その1)ではPython(x,y)のインストールまで説明しました。今日はPython(x,y)でイチオシされているPythonのIDEであるSpyderを使ってみます。IDEはIntegrated Development Environmentの略で、RでいうRStudioに相当して、エディターの他にプログラミングに必要な便利な機能がたくさんついた統合開発環境です。

Spyderを起動する

Spyder_startmenu_2

スタートメニューからPython(x,y)を開くと、下の方にSpyderのフォルダがあるはずです。Light版ではない通常版を起動しましょう。

Spyderの初回起動の画面はこんな感じです。

First_launch

右下はPythonのコンソールですが、データ解析用途にデザインされているので素のままのPythonではなくNumPyとSciPy、Matliplibに加えてguidataとquiqwtというモジュール(ライブラリ)が自動でインポートされています。(ちょっとIPythonみたいな感じですね。IPythonについては後でやります。)

左にはSpyder内蔵のエディター、右上にはオブジェクトエディターがあります。上部のグレーのタイトル部分をドラッグすることで、これらのパネルは移動できますので、好みに変えて変更しましょう。

私はエディターが縦長で右側にくるのが好きなので、そうしました。あとはオブジェクトエディターとバリアブルエクスプローラー、ファイルエクスプローラーを一緒に左上に配置して、残りは全部左下にしました。この辺りは好みですのでご自由に。

エディターを使ってみる

それでは、なにか適当なデータをプロットするスクリプトをエディターに書いてみましょう。

まず、エディターの一行目にある

# -*- coding: utf-8 -*-

ですが、Pythonのインタプリタがスクリプトを実行するときにエンコーディングを判断するのに使われます。書かなくともいいですが、その場合Asciiコードと解釈されて、日本語を表示したりすると文字化けしてしまうので、残しておくと便利でしょう。

その次のトリプルクォーテーションマークで囲まれた文字列は、doc stringと呼ばれるもので、このスクリプトの説明となるものです。一番最初の文字列は無視される仕様なので、実行されません。自分用のメモをかいたりするのに使えますし、ソースコードからドキュメンテーションを自動で作成したりするときに使われたりするものだと覚えておくとOKです。

では早速、doc stringの下から、はじめの一行を入力してみましょう。まずはPythonでデータ解析をするならお約束な

from pylab import *

をエディターに書き込みます。これはpylabというモジュールにある関数・クラスをすべてトップのネームスペースにインポートするという意味になります。MATLABではインストールされたツールボックスはいつでも使用可能ですが、Pythonではインポートしてから使用可能になります。

pylabはmatplotlibというMATLABのようなプロットするためのモジュールに入っているサブモジュールで、MATLABから来た人がmatplotlibの機能を使いやすいようにデザインされた環境を作り出します。まあライブラリの本体であるmatplotlibの中のよく使われる関数を呼び出しやすくするショートカットの集まりみたいなものだと考えておけばよいです。

Spyderのエディターには便利なショートカットキーがいろいろあるのですが、中でもF9はおすすめです。

F9

from pylab import *

それでは、この一行をエディター上で選択して、その状態でF9を押してみましょう。

どうでしょう?コンソールに同じ行が送られて実行されましたね?MATLABにも似たようなショートカットがありますが、このように、エディターにプログラムを書き貯めながら少しづづ実行し、確認しならがプログラムを書いていくことができると、デバックが非常に効率よく進められます。

さて、次のラインでは、早速インポートされたpylabの機能を呼び出してみます。

ion()

と続けましょう。

ionはinteractive mode onの略で、これをやらないとプロットしようと思い、plot(data)とした後で、show()というコマンドが実行されるまでプロットが画面にでて来ません。しかし、インタラクティブモードがオンになっていると、MATLABのようにplotを実行するたびにウィンドウがアップデートされるようになります。

ちなみに切るときはioff()で切ります。インタラクティブモードオフにする利点は、ひとつのプロットにたくさんのラインやマーカーを重ね書きするような場合、全部メモリ上に書き終わってから一度だけスクリーンへと描画するため実行速度が速くなりますが、まあionで普通は問題ありません。

インポートとネームスペース

さて、このionは先程インポートしたpylabの関数です。試しにコンソール上でhelp(ion)としてみると、matplotlib.pyplotに属している関数であることがわかります。または、オブジェクトエディターのSourceをConsoleにしてから、コンソール上でion()を実行すると同様の説明がでてきます。

先程説明した「トップレベルのネームスペースにインポートされた」というのは、どういう意味かというと通常はimport文は

import pylab

のように書くのですが、その場合pylabの関数であるionにアクセスするには本来pylab.ion()という感じに書きます。しかし、from文で始まるimportではpylabの下にあるものをpylab抜きでアクセスできるように掘り起すので、pylab.ion()がion()でアクセスできるようになって、タイピングが少なくて済むようになったのです。(ちょっとややこしいですが、このpylab.ion自体はmatplotlib.pyplot.ionを呼び出していてるので、同じものです。)

このようにトップレベルにいろいろとインポートするとタイピングは楽になりますが、やり過ぎると同じ名前の関数があった場合、上書きされてしまったりする問題があるので、基本的にはfromは使わないほうが無難です。ただし、pylabの場合、MATLABのような環境を作るためにトップレベルにインポートするように意図されていますのでfrom pylab import *が普通の使い方です。

プロットしてみる

Fig1

その次にはいよいよ適当にデータを入力してみましょう。ここではPythonのデータタイプであるリストを使ってデータを格納します。

x = [1, 2, 3]
y = [10, 20, 100]

リストはこのようにスクエアブラケットで囲みます。MATLABのように数字をスペースで区切るとエラーなのでカンマを入れてください。

いよいよプロットしてみましょう。

plot (x, y)

Figure 1というウィンドウがでてきましたね。

線の色を変えたりマーカーをつけたりするのはMATLABと同様にできます。

plot (x, y, 'ro-')

rはRed、oはマーカーの指定、-は線のありの指定です。

では、もうちょっと付け加えて見ましょう。

clf()
plot (x, y, 'ro-')
y2 = np.random.randint(0,100,3) 
plot (x, y2, 'bv-')
legend(["toy_data", "random_data"], loc="best")
xlim([0, 4])
ylim([0,110])

clf文では先程のプロットをクリアしています。 np.random.randintはランダムで0から100までの整数が3つのnumpy arrayを生成しています。plotは基本はnumpy arrayを受け取りますが、リストでも、タプルでも受け付けます。 legendはレジェンド生成です。locはロケーションで、bestにするとできるだけデータと重ならない位置を選んでくれます。xlimとylimはx,y軸の範囲を指定しています。axis([0,4,0,110])とやっても同じことになります。

ここで使った関数の引数がよくわからない場合、オブジェクトエディターのSourceをConsoleにして調べたい関数をタイプし、左のカッコまで書くとオブジェクトエディターにて説明がでてきます。例えばclfならclf(まで書くと出ます。また、help()でも同じ説明が見れます。その場合カッコなしでhelp(clf)とします。

まあ、ここまででとりあえずSpyderの使い方の感じがつかめたと思います。

pylabについてもっと知りたい方は、このNicolas P. RougierさんのMatplotlib tutorialというチュートリアルが素晴らしいです。

その3、その4では、いろいろと脱線したので興味があったら見て頂いて、次はその5 文字列、リスト、numpyスライシングへ飛ぶことをおすすめします。

目次

  • 今から始めるPython その1
  • 今から始めるPython その3 Site-Packagesってなに。モデュールのインストール・アンインストール
  • 今から始めるPython その4 pylabネームスペースの解説
  • 今から始めるPython その5 文字列、リスト、numpyスライシング
  • 続きを読む "今から始めるPython その2 Spyderを使う" »

    2014年3月 8日 (土)

    今から始めるPython その1

    最近、Pythonに興味を持っているけどもどう始めていいかよくわからないという人をよく見かけます。ちょっと前にかいた「二年前 Ruby + MATLAB + R + Python 今 95% Pythonな例」にもアクセス数があるので、似たような人が増えているのかなと思います。

    ただ、Pythonの場合は必要な情報は主に英語になりますし、周りに使っている人が少ないと、最初の慣れるまでが大変だと思います。

    この記事では、その辺りを少しでも解消できるように、最初のステップのチュートリアル、必須なライブラリや便利なサイト・ツールを紹介します。特に研究者向けに書きますが、それ以外の用途でもやっぱり同じことをおすすめすると思うので、幅広い人に参考にしてもらえるのではと思います。

    Pythonは豊富なライブラリが魅力

    Pythonはオープンソースな汎用のスクリプト言語で、豊富なオープンソースのライブラリがあるので研究にかぎらず組み合わせ次第でなんでもできるのが魅力です。ライブラリの中身は大抵はC言語でできているので、とっても速いです。できるだけ車輪の再発明を避けてライブラリを使うことで速いプログラムがが簡単にかけてしまうのです。

    MATLABとPython

    MATLABは科学・工学用の数値計算に特化した環境なので用途以外のことはあまり得意ではないかわりに、ハイクオリティな日本語ヘルプと、統合された強力なデバック環境がありますので、プログラミングの習得にはあまり時間がかけられないけれども結果がすぐにほしい場合にはやはり素晴らしいです。研究者なら周りに使っている人が多いのも大きいですし、ボスがMATLABじゃなきゃわからんという場合も多いです。

    私自身、MATLABをずっと使っていましたが、Pythonの評判や使用例(NASAとか)をみて、一年併用して、いまは完全に乗り換えました。私がMATLABでしていたこと以上のことをしています。しかもオープンソースなので全部タダです。速度的にも自分の経験では最低でも同じか速くなりました。とくにビデオの画像解析は古いバージョンのMATLAB(2008くらいまで)ではファイルの読み込みや、簡単なフィルター処理でもとても遅かったのが、Pythonに乗り換えてOpenCVを使い出したら恐ろしく速くなりました。

    また、作ったツールを他の人に使って貰う場合にMATLABではユーザーも同じバージョン以上のMATLABのライセンスが必要になってきますが、Pythonの場合はpy2exeやPyInstallerなどを使えば簡単に実行ファイルにパッケージ化して配布することが可能で、ユーザーはPythonをインストールしなくとも使えてしまいます。(MATLABも実行ファイルにパッケージ化するためのツールボックスがありますが、高いですし、ソースで配布されるケースが圧倒的に多いでしょう。)

    プログラミング初心者でも大丈夫?

    Pythonはコンピュータサイエンスを教える大学の入門コースでもっとも人気な言語となっていますし、もともと本職のプログラマーじゃないけども、必要なので最低限のプログラミングの知識が必要という研究者向けに考案された言語なため、言語の設計が親切でよく考えられていいて学習し易く、プログラミング初心者向け言語といえます。

    もし、MATLABを知っていたらPythonはとっても簡単です。とくに数値計算に必須なライブラリNumpyやプロット用のmatplotlibなどはMATLABを意識した同じ名前の関数がたくさんあります。

    Python3とPython2、32ビット版と64ビット版、どっちを使ったらいいの?

    現在、Pythonにはユニコードが強化されたバージョン3系等と2系統がありますが、ぶっちゃけPython2を使いましょう。バージョン3系はあと数年後にはメインで使われている可能性がありますが、まだ未対応のライブラリが多く現時点ではお勧めできません。

    追記。2015年になって状況はかなり変わってきました。最近の記事OpenCV3を64bitのPython3.4で使う。Python3.5とPython2.7をウィンドウズで共存させてみる。に書いた通りバージョン3系等から初めても大丈夫という感じになったと思います。

    同じ理由で、Python本体は大昔から32ビット版と64ビット版がありますし、Linuxでは64ビット版が当たり前のようですが、残念ながらウィンドウズではライブラリが32ビット用のみ提供されている場合がまだたまにあるために、下に紹介するPython(x,y)をつかって32ビット版の環境を一気に揃えるのがおすすめです。

    64ビット版対応のライブラリも増えてますが、メモリが沢山あるPCが使えてかつ沢山計算しないといけない場合以外はあまりメリットもないと思います。numpy.float64とか32ビットのPCでも使えるのであまり困りません。

    ただし、最近調べてみたらウィンドウズでも64ビット環境はかなりまともになってきているようで、そろそろ64ビットで全部いけそうなところまで来ています。私の場合、OpenCVのバージョンが3.0になって64ビットのサポートが始まったらば完全に以降できそうです。

    ウィンドウズで64ビット版の普及が遅い理由は、多くのライブラリが依存しているNumpyの開発者の多くがLinuxユーザーで、ウィンドウズでフリーでライセンスがうるさくないツールで64ビット用にCやFORTRANのコードをコンパイルするのがやたら面倒いので、ずっと棚上げされているのが原因です。でも、Christoph Gohlkeさんのようなボランティアでウィンドウズ用の64ビットのライブラリ配っている人もいるので、その気になればウィンドウズでも64ビットで行けます。

    ウィンドウズでも64ビット環境の現状に関しては、以下の記事が参考になると思います。

    まずはPython(x,y)で一気にプログラミング環境を手に入れよう

    Pythonはクロスプラットフォームな言語ですが、Mac,Lunixの人はインストールしなくとももうPython入っているので、ウィンドウズのみ解説していきます。Pythonはオープンソースでフリーなので、再配布が可能です。なので、多くの人が必要であろうライブラリをてんこ盛りした状態のPythonを配布しているサービス(ディストリビューション)が幾つかあります。Python(x,y)は学術研究用途に特化したディストリビューションで、Python本体と学術研究用途によく使われている人気ライブラリを一気にインストールしてくれます。

    学術研究用途で似たようなものはいろいろあって、EnthoughtからEnthought Python Distribution Free(いまはCanopy Expressと呼ぶらしい)や、Continuum AnalyticsのAnacondaというディストリビューションもあります。EnthoughtのFree版は同梱されるライブラリが少ないのであまりおすすめできませんが、アカデミックライセンス版がありますので、大学などの研究機関に所属していればフリーで上位版の機能が使えます。Anacondaは完全フリーで使えるのでこれも良さそうです。AnacondaはcondaというVirtualenvににた機能があるコマンドがあり、複数のPythonのバージョンを共存させることが容易です。なのでPythonがインストールされている状態でインストールしても干渉なくインストールされるのでメインはPython(x,y)で揃えて、興味があればAnacondaも同時に試すことが可能です。

    EPDもAnacondaもちょっと試しましたが、結局のおすすめはPython(x,y)です。Python(x,y)はPythonを本家のhttp://www.python.org/から落としてくると、自分でパスの設定をしないといけないですが、その辺をやってくれるので楽です。また、エクスプローラーの好きなフォルダからConsole2を開くことができる右クリックメニューを追加してくれるのがとっても重宝します。追記)2015あたりからPython(x,y)の方は活動が下火になっているようです。ホームページも移転して、リンク切れが多いですがまだ最新版のダウンロードは生きています。そしてAnacondaの人気がだいぶ上がってきています。ウィンドウズでもLinuxでも色んな所で好評。Python(x,y)の方がシンプルですが、Anacondaの方が高機能で、各ライブラリを最新版に保つのが楽なのでAnacondaを使い始めました。近いうちに記事にします。

    Python(x,y)はてんこ盛りなので500MBとインストーラーのファイルサイズがでかいですが、一回きりですし、ライブラリを最新版に保つにはPython(x,y)から個別のプラグインのインストーラーが優秀なので、これを出来るだけ使いましょう(2016年2月現在はプラグインのページがリンク切れのようです。悲しい。)。理由はSite-Packagesのプラグイン用のフォルダにuninstall.exeを置いてくれるので、アンインストールが簡単なことと、pipではインストールが難しいものがあるからです。Python(x,y)はpipもインストールして、パスまで通してくれるのでpipで済むようなピュアPythonなモデュールとかならば、pipでもいいです。pipの使い方はこちら

    OpenCVなどpipではうまくインストール出来ないものがあるので、基本はPython(x,y)のサイトのプラグインのページから個別にインストーラーをダウンロードするか、Christoph Golkeさんのバイナリーを使うといいです。インストールが難しいときがあるOpenCVに関してはGolkeさんのインストーラーが一番簡単でおすすめです。

    ライブラリは言語自体よりも大事

    どの言語でも結構そうですが、Pythonの言語自体の基本的な文法は他の言語と重複する部分も多いし、それほど覚えることもありません。とくにMATLABをすでに知っている人は楽でしょう。練習が必要なのはリストコンプリヘンションくらいでしょう。ラムダとか別に覚えなくともよいと思うし。

    しかし、なにか役立つプログラムを作るには必要なライブラリを探して、ライブラリの使い方を覚える必要があります。ライブラリとはMATLABで言うツールボックスみたいなもので、便利な関連する関数やクラスの集まりで、これを利用することで短期間で高機能なプログラムが書けます。ぶっちゃけ言語よりはライブラリの量と質、チュートリアルなどの方が大事なのです。その点、学術研究ではPythonのライブラリはnumpy、matplotlib、IPython、Scikit-learn、OpenCVなどなどとても充実しています。

    定番ライブラリを駆け足で説明

    それではPython(x,y)についてくる定番ライブラリを見て行きましょう。Python(x,y)のサイトのStandardPluginsから一覧が見れます。ここにあるプラグインとはライブラリのことです。

    科学計算関係

    NumPy
    多次元データを扱うための配列を提供する必須ライブラリです。ライブラリはほぼC言語でできているのでとっても速いです。これとSciPyとmatplotlibと合わせてMatlabのような環境が手に入ります。
    SciPy
    こちらはNumPyをつかってFFTとか画像解析とか便利な関数が沢山用意されています。MatlabのImage Processing ToolboxやSignal Processing Toolboxに大体相当します。
    Bottleneck
    Numpyの一部機能を拡張して高速化したもの。
    SymPy
    Mathmaticaみたいなもんです。
    scikits-learn
    SciPyを補う感じで、とくに機械学習に関連したライブラリ。
    pandas
    RにあるData Frameの機能をNumPyを使って再現したものです。

    プロット関係

    Matplotlib
    グラフをプロットするのに欠かせない。必須ライブラリです。plotやimshow、histなどMATLABでお馴染みのコマンドが使えます。epsで出力してIllustratorで編集したりして論文用にかっこ良くしたりも出来ます。
    Veusz
    ビュースと読むらしい。ライブラリというより単独のツールだが、numpyアレイやcsv、エクセルなどからデータをインポートしてハイクオリティな図を制作するのに便利。Matplotlibは日常のちょっとしたデータ解析の出力に使い、こちらは論文に投稿するような気合の入った図を作るのに便利。Illustratorでする作業を減らせます。
    ReportLab
    計算結果のグラフやテキスト、イメージを好きに配置して複数ページに渡るレポートを自動出力したりするのに便利。Matplotlibだけでもある程度PDFの出力ができるが、こちらが自由度高い。

    画像解析

    Pillow
    Pythonでの画像データの扱いはPython Imaging Library (PIL) というライブラリが定番でしたが、ここ数年開発が停滞してきたのでフォークされたのがPillowです。画像ファイルの読み込み・変換や、NumPyとのやりとりなどに使います。Pillow、PILは中身がPythonで書かれている部分がかなり多いので遅いです。
    OpenCV
    監視カメラなどのリアルタイムでの動画解析用に作られたライブラリです。中身はC/C++なので速いです。PILでできることは大体こっちでも出来ます。SciPyのndimageとPillow、OpenCVがあれば大体画像・動画についてはなんでも出来ます。

    コンソール・開発環境

    Spyder
    MATLABにとても良く似た統合開発環境が手に入る。GUIはQtでできている。エディター、コマンドコンソール、変数ビュアー、ヘルプビュアーなどなどMATLABから来た方はまずこれを試してみるべきでしょう。
    IPython
    こちらは通常のpythonのインタラクティブコンソールを便利にした環境です。Spyderよりシンプルな環境が良い人はこちらをチェック。通常はpylabオプションを付けて起動して、matplotlibがインポートされた環境で使いデータをexploratoryに解析したりするのに使います。しかし、IPythonの拡張機能は沢山あるので、Python初心者がいきなり使うとIPythonの機能、Python標準ライブラリ、サードパーティのライブラリの境目がどこにあるか混乱するかもしれない。少なくとも私は混乱したのでDreampieというマルチラインコンソールを併用しています。
    IPython notebook
    IPythonをウェブブラウザから使うことのできるツールで、コードと計算結果をウェブページとして一緒に記録しておけるし、あとから一部変更して計算しなおしたりもできる。データ解析をどうやってやったのか説明するのに便利。

    GUI関係

    GUIとはグラフィカルユーザインタフェースのことでようはプログラムのウィンドウとその上のボタンとかイメージとかのこと。PythonのGUIライブラリについてはPython GUIツールキット個人的な比較のまとめを参照。

    PyQt
    クロスプラットフォームなGUIライブラリ。QtにはコミュニティベースなPySideというのもあるが、こちらはRiverbankという会社が作っているPyQt4の方。
    wxPython
    これもクロスプラットフォームなGUIライブラリ。当方はQtじゃなくwxを使っています。Qtは隣の芝生でとても青いでが、ライセンスが自由なwxでハッピーです。
    VTK
    OpenGLを使っているので高速な3Dビジュアリゼーションライブラリ。多少GUIもできる。クロスプラットフォーム。

    ツール関係

    Pip
    これはコマンドラインツールでpip install numpyなどのようにして使って必要なライブラリをインストールしたり、アップデートしたりするのに便利だが、Python(x,y)を使っていればあまり活躍の機会がないかもしれない。
    py2exe
    パッケージ化して、EXEファイルを作って配布するときはこちらを使う。これもコマンドラインツール。GUI2Exeというツールを使えば、コマンドを覚えなくとも画面をクリックして使える。
    cx_Freeze
    こちらもパッケージ化して、EXEファイルを作って配布するときに使うツール。GUI2Exeにも対応。py2exeより新しいが、py2exeの方が安定している。
    Pywin32
    MSウィンドウズの機能をPythonから使うときに便利なライブラリ。

    次回その2では、Spyderを使いながら何かプロットして、Spyderの基本的な使い方をみてみましょう。

    目次

  • 今から始めるPython その1
  • 今から始めるPython その2 Spyderを使う
  • 今から始めるPython その3 Site-Packagesってなに。モデュールのインストール・アンインストール
  • 今から始めるPython その4 pylabネームスペースの解説
  • 今から始めるPython その5 文字列、リスト、numpyスライシング
  • 続きを読む "今から始めるPython その1" »

    しろののツイッタータイムライン

    • ツイッターは5つ目も凍結されました。6つ目での復活も不可能。なのでnoteに注力しています。

      と思ったら、イーロン・マスクの買収が公になってアカウントが復活できました。ありがとうマスク。

      トランプ関連記事の一覧リスト

    オススメたち

    2024年12月
    1 2 3 4 5 6 7
    8 9 10 11 12 13 14
    15 16 17 18 19 20 21
    22 23 24 25 26 27 28
    29 30 31        

    はてブ

    無料ブログはココログ