今から始める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はコンピュータサイエンスを教える大学の入門コースでもっとも人気な言語らしい | トップページ | 2の倍数がプログラマー心をくすぐる「2048」が面白い件。パズルゲームの著作権? »
「学問・資格」カテゴリの記事
- ウイルスを殺すのは簡単。人に無害でやるのが難しいの!! 二酸化塩素「こう?えい!」(2020.03.11)
- 老化はエピジェネティクスな影響が積り、スプライシングに影響を与えるのかも(2017.11.20)
- シネッセンス細胞がアツい。不老不死とハゲの治療が同時に可能か?(2017.11.18)
- 古めの論文でテキスト選択がおかしい時の対処法(2017.09.08)
- Juliaやってみよう。五日目。Pythonと速度比較。(2017.08.01)
「Python」カテゴリの記事
- Noteの記事をPythonでバックアップしといた。(2021.05.05)
- JupyterLabでも好きな外部エディターを使いたい!(2018.05.02)
- ローカルエリア内のJupyterLabサーバーにLAN経由で接続する。(2018.05.02)
- Juliaやってみよう。五日目。Pythonと速度比較。(2017.08.01)
- Juliaやってみよう。四日目。@timeでプロファイリング(2017.07.16)
「今から始めるPython」カテゴリの記事
- 今から始めるPython その6 numpyの基本 スライシングの続き(2014.10.03)
- 今から始めるPython その5 文字列、リスト、numpyスライシング(2014.08.02)
- 今から始めるPython その4 pylabネームスペースの解説(2014.07.26)
- 今から始めるPython その3 Site-Packagesってなに。モデュールのインストール・アンインストール(2014.03.17)
- 今から始めるPython その2 Spyderを使う(2014.03.11)
« Pythonはコンピュータサイエンスを教える大学の入門コースでもっとも人気な言語らしい | トップページ | 2の倍数がプログラマー心をくすぐる「2048」が面白い件。パズルゲームの著作権? »
コメント