Pythonを用いた�気象の理解と模倣
京都大学防災研究所
榎本剛
地球流体データ解析・数値計算ワークショップ 2021/3/31 11:00〜12:00
自己紹介
榎本剛
京大防災研 教授
気象力学,大気大循環モデル
MacPortsコミッタ
地球流体電脳倶楽部との関わり
お品書き
The 2020 Top Programming Languages
気象でよく使われる言語
今はGMT4で画像検索がGMT47の検索でないと「あまちゃん」は出てこない
データサイエンスでよく使われる言語
R: 統計言語,Sのオープンソース版・後継
Python: 汎用インタプリタ言語
RとPython連携: Jupyter, r2py
どのPython
本家python.orgは最新。Christoph GohlkeさんのWindowsバイナリを使うと便利
MacPortsのPythonは最新についていっている。
外部ライブラリのインストールが楽なcondaがよく使われているが,�pipとの二重になって管理となることがある。
Windows 10ではMicrosoft Storeからも無料で取得できる。
クラウド pythonanywhere, Google Colaboratory, Azure Notebooksは終了
モジュールとパッケージそしてライブラリ
モジュール
パッケージ
ライブラリ
モジュールとしての再利用
import foo
x = 3
y = 6
foo.add_two(x, y)
def add_two(x, y):
return x + y
if __name__ == "__main__":
x = 1
y = 2
add_two(x, y)
foo.py
有用なライブラリ
Numpy/Scipy: 配列・科学技術計算
matplotlib: 描画の標準ライブラリ
ipython/jupyter: 対話型シェル,ウェブインターフェース
Cartopy: 地図の描画。地図投影。basemapは開発停止
MetPy: 気象データの
Magics: ECMWF製のC++ライブラリ。Pythonインターフェースを提供
netcdf4/xarray: NetCDFデータの入出力
pandas: PythonでRのような統計
PyArma
C++で書かれたArmadilloのPythonインターフェース
MATLAB寄りの文法で使いやすさを重視
Numpy/Scipyに代わる選択肢
Armadilloのベクトルはなく1行または1列のmatを使う。
疎行列のインターフェースはまだ実装されていない。
MATLAB/Octave | PyArmadillo | Numpy |
A(1, 1) | A[0, 0] | A[0, 0] |
size(A, 1) | A.n_rows | A.shape[0] |
A' | A.t() | A.transpose() |
A = zeros(3) | A = zeros(3, 3) | A = np.zeros((3, 3)) |
A * B | A * B | A @ B |
A .* B | A @ B | A * B |
A \ B | pa.solve(A, B) | np.linalg.solve(A, B) |
[A B] | pa.join_horiz(A, B) | np.hstack((A, B)) |
save -ascii 'A.txt' A | A.save("A.txt", raw_ascii) | np.savetxt("A.txt", A) |
Pythonはなぜ0始まりを使っているのか
Why Python uses 0-based indexingでGuido van Rossumが説明している。
前身のABCは1始まりだった。
Pythonの開発言語Cは0,Guidoが最初に学んだAlgol, Fortran, Pascalは1始まり。
スライスは「最初からn要素を取り出す」という使い方が考えられる。
0始まりの半開区間ならa[:n]やa[i:i+n]と書けてきれい。
Jupyter
Pythonの一習得法
標準大気
import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(5, 5)) # figsizeは必須ではない
T = [15.0, -56.5, -56.5, -44.5, -2.5, -2.5, -58.5, -86.2]
h = [0., 11, 20., 32., 47, 51., 71, 84.852]
ax.plot(T, h)
fig.savefig("standard.png") # ファイルに保存
plt.show() # 表示
import Magics.macro as mg
output = mg.output(
output_name = "map",
output_formats = ["png"],
output_name_first_page_number = "off")
mgmap = mg.mmap(
subpage_map_area_definition = "corners",
subpage_lower_left_longitude = -80.0,
subpage_lower_left_latitude = 0.0,
subpage_upper_right_longitude = 160.0,
subpage_upper_right_latitude = 70.0,
subpage_map_projection = "lambert"
)
coast = mg.mcoast(
map_coastline_colour = "grey",
map_coastline_land_shade = "on",
map_coastline_land_shade_colour = "cream",
map_coastline_sea_shade = "on",
map_coastline_sea_shade_colour = "white",
map_label = "off")
mg.plot(output, mgmap, coast)
気象庁全球解析値
利用事例