IDL/FortranユーザがPythonに移行した際のメモ

# 目的
Fortran 90で出力したバイナリファイル等をPythonで読み込み解析。
開発で参考になったリンクや注意などをメモ。


# 書いている人
普段はFortran 90とIDL(Interactive Data Language)。
Pythonはあまり慣れていない。
ライセンスが必要なIDLの代わりにPythonに移行中。


# 個人的な開発方針
- pylabはGoogle検索で引っかかりにくい。直接numpyやmatplotlibをインポートする。
- from [package] import *は極力やらない。
- サーバ上でも使いたいので、基本的にコンソール上で利用。


# 環境
Python 3.6.0 |Anacoda 4.3.0 on OS X El Capitan


# Python全般
### 命名規則
PEP8に従う。
[[Pythonコーディング規約]PEP8を読み解く](https://qiita.com/simonritchie/items/bb06a7521ae6560738a7)
変数名・関数名がsnake_caseを推奨されている。
Fortranが大文字小文字を区別しないため、同種類の命名規則をつけるときに良さそう。
[プログラミングでよく使う英単語のまとめ【随時更新】](http://qiita.com/Ted-HM/items/7dde25dcffae4cdc7923)
[外国人が語る：英語でクラスやメソッド等の名付け方](http://qiita.com/gazayas/items/3d352d1b6ec9a225c6f6)
[うまくメソッド名を付けるための参考情報](http://qiita.com/KeithYokoma/items/2193cf79ba76563e3db6)

### モジュール情報
[numpyとかscipyとかのバージョンの表示方法](http://blog.mwsoft.jp/article/109031043.html)
[Python Tips：ライブラリ・モジュールの場所を調べたい](http://www.lifewithpython.com/2014/07/python-get-location-of-libraries-modules-packages.html)

### 変数
[Pythonの値渡しと参照渡し]
(https://python.dogrow.net/?p=274)
[値渡しと参照渡しと参照の値渡しと]
(https://qiita.com/ur_kinsk/items/949dabe975bdc1affb82)
デフォが参照の値渡しってことでいいんだろか。
[Determine if variable is defined in Python]
(https://stackoverflow.com/questions/1592565/determine-if-variable-is-defined-in-python)
[四則演算 - 数値 - Python入門]
(http://www.pythonweb.jp/tutorial/num/index2.html)

### ループ
多重ループの回避。
[itertools.product](https://docs.python.jp/3/library/itertools.html#itertools.product)
[Python で多重ループを回避する](https://qiita.com/QUANON/items/bce7495be0e350911e66)

### システムコール
[17.5. subprocess — サブプロセス管理](https://docs.python.jp/3/library/subprocess.html)

### ソート
[ソート HOW TO]
(https://docs.python.jp/3/howto/sorting.html)
[numpyでソート後配列のインデックスを取得]
(https://python.dogrow.net/?p=274)


# 入出力
Fortranの出力ファイルは書式なし出力（データ）と書式あり出力（パラメータ等）。

### 書式なし出力
Fortranの書式なし出力を読む場合、scipy.io.FortranFileが有用だった。
中身はnumpy.fromfile等で構成されている。
[scipy.io.FortranFile](https://docs.scipy.org/doc/scipy/reference/generated/scipy.io.FortranFile.html)
ただし、公式で注意されているように、Fortranでdirect accessやstreamで出力して
numpy.fromfileで読み込んだ方がエンディアンなど気にしなくて良い。

### 書式あり出力
普通に読む。str.split、str.splitlinesなどを利用。
行末の改行文字に注意。
[4.7. テキストシーケンス型 — str]
(http://docs.python.jp/3.6/library/stdtypes.html#text-sequence-type-str)


# NumPy
### 配列要素指定

範囲で指定する場合にIDLと違っていて間違えそう。

``` python
import numpy as np
np.arange(0,10)
# array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
np.arange(0,10)[3]
# 3
np.arange(0,10)[0:3]
# array([0, 1, 2]) 範囲で指定する場合、右端の要素は含まれない。
```

### 一般
[配列の形状変換](https://deepage.net/features/numpy-reshape.html)
reshapeで良さそう。

[配列生成関連ルーチン](https://docs.scipy.org/doc/numpy-1.13.0/reference/routines.array-creation.html)

[配列インデックス関連関数一覧](https://docs.scipy.org/doc/numpy-1.13.0/reference/routines.indexing.html)

[数学関数一覧](https://docs.scipy.org/doc/numpy-1.13.0/reference/routines.math.html)

[論理演算関連関数一覧](https://docs.scipy.org/doc/numpy-1.13.0/reference/routines.logic.html)

### 差分計算
基本的には解析なのでひどく遅くならなければ素直に実装。
[2. Numpy array (配列) のコツ](http://japanichaos.appspot.com/NumpyArray.html)
[numpy.roll](https://docs.scipy.org/doc/numpy/reference/generated/numpy.roll.html)

Pythonで色々実装したいときはNumbaなどの高速化。
[Numba](http://numba.pydata.org/)


# matplotlib
基本的にはpyplotで済ませる。

### チュートリアル
[Pyplot tutorial](http://matplotlib.org/users/pyplot_tutorial.html)

[matplotlib入門](http://bicycle1885.hatenablog.com/entry/2014/02/14/023734)

[Anatomy of Matplotlib -- tutorial developed for the SciPy conference](https://github.com/matplotlib/AnatomyOfMatplotlib)
これが一番理解が進みそう。
そのうちちゃんと読みたい。

### グローバル設定: rcParams
IDLのSystem Variable（!p.〜, !x.〜など）に相当するものがrcParamsっぽい。
スタートアップファイル（.idl_startup）に相当するものとしては、[matplotlibrcを設定すれば良いらしい。](https://matplotlib.org/users/customizing.html)
場所は以下。

``` python
import matplotlib as mpl
print(mpl.get_configdir())
# 自環境では ~/.matplotlib と出るため ~/.matplotlib/matplotlibrc を作れば良い。
```

とりあえず今のところ以下を設定。

``` python
backend      : TkAgg  # matplotlibの描画ウィンドウを別アプリ扱い。
interactive  : True  # show()をいちいち書かずにプロットを表示。
xtick.top            : True  # draw ticks on the top side
ytick.right          : True  # draw ticks on the right side
xtick.direction      : in    # direction: in, out, or inout
ytick.direction      : in    # direction: in, out, or inout
xtick.minor.visible  : True  # visibility of minor ticks on x-axis
ytick.minor.visible  : True  # visibility of minor ticks on y-axis
```

バッチジョブとして図を作る時は、以下の設定を入れる。

``` python
import matplotlib.pyplot as plt
plt.rcParams['interactive'] = False
```

変更したrcParamsはrc_file_defaults()で戻せる。

``` python
import matplotlib as mpl
mpl.rc_file_defaults()
```

rcParamsはmatplotlib.rcdefaults()でも既定値に戻せるが、
こちらはmatplotlibrcで変更した設定も戻ってしまうことに注意。
rc_file_defaults()なら既定値からmatplotlibrcを適用した状態にしてくれる。

### 体裁全般
いつも使いたい設定は[matplotlibrc](https://matplotlib.org/users/customizing.html)に書くと良さそう。

[matplotlibのグラフの体裁を整える](http://d.hatena.ne.jp/y_n_c/20091122/1258842406)

[matplotlib: 論文用に図の体裁を整える](https://qiita.com/rnhd/items/325d21621cfe9e553c17)

[matplotlibやpylabで論文向きの白黒のグラフをプロットする](https://qiita.com/kumagi/items/558593fa3e910d290592)

[グラフの体裁はスタイルシートでも決められる。](https://note.nkmk.me/python-matplotlib-matplotlibrc-stylesheet/)

[matplotlib 2.0での変更点](https://matplotlib.org/users/dflt_style_changes.html)
図が一杯あって参考になる。

[matplotlibで論文やプレゼン資料用の図を作るためのテクニック4選](https://qiita.com/nobolis/items/cb84394fbf0ce26cb1f7)
あんまり使わないけど棒グラフと凡例。


### 1次元データ
[matplotlib で使える marker を全て試してみる－python](http://ailaby.com/plot_marker/)

[How to do a scatter plot with empty circles in Python?]
(https://stackoverflow.com/questions/4143502/how-to-do-a-scatter-plot-with-empty-circles-in-python)

[ログスケール表示・グリッド表示](https://qiita.com/irs/items/cd1556c568887ff2bdd7)

### 2次元データ
pcolorはデータが大きくなると遅い。pcolormeshを使う。

[matplotlib.pyplot.pcolormesh](https://matplotlib.org/devdocs/api/_as_gen/matplotlib.pyplot.pcolormesh.html)

[matplotlib.pyplot.colorbar](https://matplotlib.org/devdocs/api/_as_gen/matplotlib.pyplot.colorbar.html)

[matplotlibで等高線やら何やらのプロット](http://d.hatena.ne.jp/y_n_c/20091122/1258904025)

[pcolorfastなるものもあるらしい。](http://ikarino99.hatenablog.com/entry/2016/07/01/095441)

### カラー
[Colormap Reference](http://matplotlib.org/examples/color/colormaps_reference.html)
[Colormap Normalization](http://matplotlib.org/users/colormapnorms.html)

### フォント
[How to change fonts in matplotlib (python)?](http://stackoverflow.com/questions/21321670/how-to-change-fonts-in-matplotlib-python)

### 配置
[matplotlibでグラフの文字サイズを大きくする](http://qiita.com/Tatejimaru137/items/4ee6a73114d07d85bfd7)
[Tight Layout guide](http://matplotlib.org/users/tight_layout_guide.html)
[Mac OSXでtight_layoutのエラーが出た時の対処法](http://myenigma.hatenablog.com/entry/2015/10/09/223629#Mac-OSXでtight_layoutのエラーが出た時の対処法)

### 出力
[matplotlib.figure.Figure.savefig](http://matplotlib.org/api/figure_api.html#matplotlib.figure.Figure.savefig)
[Matplotlibの高解像度画像保存](http://nanyakan.blogspot.jp/2013/02/matplotlib.html)

### ウィンドウ
[How do I close all pyplot windows (including ones from previous script executions)?](https://stackoverflow.com/questions/33853801/how-do-i-close-all-pyplot-windows-including-ones-from-previous-script-execution)

### pyplot, figure, axesの違い
[stack overflow: Understanding matplotlib: plt, figure, ax(arr)?](https://stackoverflow.com/questions/35677767/understanding-matplotlib-plt-figure-axarr)
[AnatomyOfMatplotlib-Part1-Figures_Subplots_and_layouts.ipynb](http://nbviewer.jupyter.org/github/WeatherGod/AnatomyOfMatplotlib/blob/master/AnatomyOfMatplotlib-Part1-Figures_Subplots_and_layouts.ipynb)
[PyplotとAxesの役割の公式説明](https://matplotlib.org/api/pyplot_summary.html#the-object-oriented-api)
[早く知っておきたかったmatplotlibの基礎知識、あるいは見た目の調整が捗るArtistの話](https://qiita.com/skotaro/items/08dc0b8c5704c94eafb9)

どうやら本来はfigureでウィンドウを管理し、axesでウィンドウ内の各プロットを管理するもので、
pyplotはそれをスクリプト風に使いやすくしたラッパーらしい。