1.1. Python科学計算エコシステム¶
著者: Fernando Perez, Emmanuelle Gouillart, Gaël Varoquaux, Valentin Haenel
1.1.1. なぜ Python?¶
1.1.1.1. 科学者のニーズ¶
データを取得する (シミュレーション、実験コントロール)、
データを操作し、処理する、
報告書や出版物用に、結果を素早く理解できるように視覚化するだけでなく、高品質な図も作成できます。
1.1.1.2. Pythonの強み¶
バッテリーを含む 古典的な数値手法、プロット、データ処理ツールの既存の ブリック の豊富なコレクション。 曲線のプロット、フーリエ変換、フィッティングアルゴリズムを再プログラムする必要はありません。 車輪の再発明はやめよう!
学びやすい ほとんどの科学者はプログラマーとして給料をもらっているわけではないし、そのような訓練も受けていません。 彼らが必要とするのは、曲線を描き、信号を平滑化し、フーリエ変換を数分で行えることです。
簡単なコミュニケーション 研究室や企業内でコードを存続させるためには、共同研究者や学生、あるいは顧客が本と同じように読めるものでなければなりません。 Pythonの文法はシンプルで、読者をコードの数学的・科学的理解から逸脱させるような奇妙な記号や長いルーチン仕様は避けています。
効率的なコード Pythonの数値計算モジュールは計算効率が高いです。 しかし、言うまでもなく、非常に高速なコードであっても、それを書くのに多くの時間を費やしてしまっては意味がありません。Pythonは素早い開発時間と素早い実行時間を目指しています。
普遍的 Pythonは様々な問題に使われる言語です。 Pythonを学ぶことで、新しい問題ごとに新しいソフトウェアを学ぶ必要がなくなります。
1.1.1.3. Pythonは他のソリューションと比べてどうですか?¶
コンパイル言語: C、C++、Fortran...¶
- 長所:
非常に速いです。重い計算では、これらの言語を上回るのは難しいです。
- 短所:
使いずらい: 開発中のインタラクティブ性なし、必須コンパイルステップ、冗長な構文、手動でのメモリー管理。 これらは非プログラマーにとって 難しい言語 です。
Matlabスクリプト言語¶
- 長所:
多くの異なるドメインに対応する、多数のアルゴリズムを持つライブラリの非常に豊富なコレクションです。 これらのライブラリは多くの場合コンパイル言語で書かれているため、実行速度が速いです。
快適な開発環境: 包括的なヘルプ、統合エディターなど。
商用サポートがあります。
- 短所:
ベースとなる言語はかなり貧弱で、上級ユーザーにとっては制約になりかねません。
無料ではないし、すべてがオープンソースというわけでもありません。
Julia¶
- 長所:
高速なコードでありながら、インタラクティブでシンプルです。
PythonやC言語に簡単に接続できます。
- 短所:
数値計算に限定したエコシステム。
まだ若いです。
その他のスクリプト言語: Scilab, Octave, R, IDL, etc.¶
- 長所:
オープンソースで無料、少なくともMatlabよりは安いです。
非常に高度な機能もあります (Rでの統計など)
- 短所:
利用可能なアルゴリズムはMatlabより少なく、言語も高度ではありません。
ソフトウェアによっては、あるドメインに特化したものもあります。 例: 曲線を描くための Gnuplot。これらのプログラムは非常に強力ですが、プロットなど単一の使い方に限定されています。
Python¶
- 長所:
非常に豊富な科学計算ライブラリ
考え抜かれた言語、非常に読みやすく、構造化されたコードを書くことができます: 私たちは "自分たちが考えていることをコード化します" 。
科学計算以外の多くのライブラリ (ウェブサーバー、シリアルポートアクセスなど)
フリーでオープンソースのソフトウェアで、広く普及し、活気あるコミュニティがあります。
IPython, Spyder, Jupyter notebooks, Pycharm, Visual Studio Code など、さまざまな強力な環境で仕事ができます
- 短所:
より専門的なソフトウェアやツールボックスにあるようなアルゴリズムばかりではありません。
1.1.2. 科学的なPythonのエコシステム¶
MatlabやRとは異なり、Pythonには科学計算のためのモジュールがあらかじめバンドルされているわけではありません。 以下は、科学計算環境を得るために組み合わせることができる基本的な構成要素です:
Python 、汎用的でモダンなコンピューティング言語
言語: フロー制御、データタイプ (
string,int) 、データ収集 (lists, dictionaries)、など。標準ライブラリーのモジュール: 文字列処理、ファイル管理、簡単なネットワークプロトコル。
Pythonで書かれた多数の特殊なモジュールやアプリケーション: ウェブフレームワークなど ... と科学計算。
開発ツール (自動テスト、ドキュメント作成)
コア数値演算ライブラリ
NumPy: numerical computing with powerful numerical arrays objects, and routines to manipulate them. https://numpy.org/
参考
SciPy : 高レベルの数値計算ルーチン。 最適化、回帰、補間など https://scipy.org/
参考
Matplotlib : 2次元可視化、 "出版可能な" プロット https://matplotlib.org/
参考
高度なインタラクティブ環境:
IPython, an advanced Python console https://ipython.org/
Jupyter, notebooks in the browser https://jupyter.org/
Domain-specific packages,
pandas, statsmodels, seaborn for statistics
sympy は symbolic computing を行うためのものです。
scikit-image は image processing を行うためのものです。
scikit-learn は machine learning を行うためのものです。
and many more packages not documented in the Scientific Python Lectures.
1.1.3. 開始前に: 動作環境のインストール¶
Pythonには様々なフレーバーがあり、インストールする方法もたくさんあります。しかし、科学計算モジュールの最適化されたバージョンがすぐに提供される科学計算ディストリビューションをインストールすることをお勧めします。
Linux環境下で
最近のディストリビューションであれば、ほとんどのツールはパッケージ化されているので、パッケージマネージャーを使うことをお勧めします。
その他のシステム
完全な機能を備えた科学用 Python ディストリビューションがいくつかあります:
1.1.4. The workflow: interactive environments and text editors¶
Interactive work to test and understand algorithms: In this section, we describe a workflow combining interactive work and consolidation.
Pythonは汎用言語です。 このように、恵まれた環境は一つではないし、その使い方も一つではありません。 そのため、初心者が道を見つけるのは難しくなりましたが、Pythonをプログラム、ウェブサーバー、組み込み機器に使用することが可能になりました。
1.1.4.1. インタラクティブワーク¶
IPython コンソール、あるいはその所産である Jupyter notebook とのインタラクティブな作業をお勧めします。 アルゴリズムを探求し、理解するのに便利です。
ipython を開始します:
In [1]: print('Hello world')
Hello world
オブジェクトの後に ? 演算子を使ってヘルプを得ます:
In [2]: print?
Signature: print(*args, sep=' ', end='\n', file=None, flush=False)
Docstring:
Prints the values to a stream, or to sys.stdout by default.
sep
string inserted between values, default a space.
end
string appended after the last value, default a newline.
file
a file-like object (stream); defaults to the current sys.stdout.
flush
whether to forcibly flush the stream.
Type: builtin_function_or_method
参考
IPythonユーザーマニュアル: https://ipython.readthedocs.io/en/stable/
Jupyter Notebook クイックスタート: https://docs.jupyter.org/en/latest/start/index.html
1.1.4.2. エディターによる作業の詳細¶
この先、インタラクティブに作業するだけでなく、Pythonファイルを作成し、再利用することも重要になります。そのためには、強力なコードエディターが役に立ちます。 使いやすいエディターをいくつか紹介しましょう:
Spyder: IPythonコンソール、デバッガー、プロファイラー... が統合されています。
PyCharm: IPythonコンソール、ノートブック、デバッガが統合されています... (自由に利用できますが、商用です)
Visual Studio Code: Pythonコンソール、ノートブック、デバッガ、...が統合されていいます
これらのいくつかは様々なサイエンティフィックPythonディストリビューションに同梱されており、メニューで見つけることができます。
練習として、コードエディターで my_file.py ファイルを作成し、以下の行を追加します:
s = 'Hello world'
print(s)
IPythonのコンソールやノートブックで実行し、結果の変数を調べることができます:
In [3]: %run my_file.py
Hello world
In [4]: s
Out[4]: 'Hello world'
In [5]: %whos
Variable Type Data/Info
----------------------------
s str Hello world
1.1.4.3. IPythonとJupyterのヒントとコツ¶
ユーザーマニュアルには豊富な情報が掲載されています。 ここでは、4つの便利な機能を簡単に紹介します: 履歴 、 タブコンプリート 、 マジック機能 、と エイリアス 。
コマンド履歴 UNIXシェルのように、IPythonコンソールはコマンドヒストリーをサポートしています。前に入力したコマンドをナビゲートするには、 up と down を入力します:
In [6]: x = 10
In [7]: <UP>
In [8]: x = 10
Tab completion Tab completion, is a convenient way to explore the structure of any object you’re dealing with. Simply type object_name.<TAB> to view the object’s attributes. Besides Python objects and keywords, tab completion also works on file and directory names.*
In [9]: x = 10
In [10]: x.<TAB>
as_integer_ratio() conjugate() imag to_bytes()
bit_count() denominator numerator
bit_length() from_bytes() real
Magic functions
The console and the notebooks support so-called magic functions by prefixing a command with the
% character. For example, the run and whos functions from the
previous section are magic functions. Note that, the setting automagic,
which is enabled by default, allows you to omit the preceding % sign. Thus,
you can just type the magic function and it will work.
その他、便利なマジック機能があります:
%cdto change the current directory.In [11]: cd /tmp /tmp
%cpasteallows you to paste code, especially code from websites which has been prefixed with the standard Python prompt (e.g.>>>) or with an ipython prompt, (e.g.in [3]):In [12]: %cpaste
%timeitallows you to time the execution of short snippets using thetimeitmodule from the standard library:In [12]: %timeit x = 10 10.4 ns +- 0.0109 ns per loop (mean +- std. dev. of 7 runs, 100,000,000 loops each)
%debugallows you to enter post-mortem debugging. That is to say, if the code you try to execute, raises an exception, using%debugwill enter the debugger at the point where the exception was thrown.In [13]: x === 10 Cell In[13], line 1 x === 10 ^ SyntaxError: invalid syntax In [14]: %debug > /home/jarrod/.venv/lectures/lib64/python3.11/site-packages/IPython/core/compilerop.py(86)ast_parse() 84 Arguments are exactly the same as ast.parse (in the standard library), 85 and are passed to the built-in compile function.""" ---> 86 return compile(source, filename, symbol, self.flags | PyCF_ONLY_AST, 1) 87 88 def reset_compiler_flags(self): ipdb> locals() {'self': <IPython.core.compilerop.CachingCompiler object at 0x7f30d02efc10>, 'source': 'x === 10\n', 'filename': '<ipython-input-1-8e8bc565444b>', 'symbol': 'exec'} ipdb>
Aliases
Furthermore IPython ships with various aliases which emulate common UNIX
command line tools such as ls to list files, cp to copy files and rm to
remove files (a full list of aliases is shown when typing alias).