Jupyter 操作の基礎, Python, IPython の基礎/Python で数学を

この記事は11分で読めます

このサイトは学部では早稲田で物理を, 修士では東大で数学を専攻し, 今も非アカデミックの立場で数学や物理と向き合っている一市民の奮闘の記録です. 運営者情報および運営理念についてはこちらをご覧ください.

中高の数学の復習から専門的な数学・物理までいろいろな情報を発信しています.
中高数学に関しては自然を再現しよう役に立つ中高数学 中高数学お散歩コース
大学数学に関しては現代数学観光ツアーなどの無料の通信講座があります.
その他にも無料の通信講座はこちらのページにまとまっています.
ご興味のある方はぜひお気軽にご登録ください!


これは Python, 特に numpy, scipy, sympy, matplotlib を使った,
数学や物理ネタと Python プログラミングに関する記事だ.
これから勉強の記録をつけること,
それを共有することに目的に記事を書いていく.
GitHub にも関係するコードを置いていくし,
このサイトでもタグで記事を一覧できるようにしていく.

ご興味ある方はぜひ継続的にチェックしてほしい.

readme を書いた時点では次のバージョンで動かしている.

  • Python 3.5.1 :: Anaconda 4.1.0 (x86_64)

諸注意

前回の記事 Jupyter のインストール/Python で数学をで Jupyter をインストールしていることを前提にしている.
今回の分は GitHub のこのページを見てもらうと早い.

GitHub 上の ipynb をダウンロードし,
Jupyter を実行してローカルで実行しながら遊ぶのが楽だろう.

またコードの 2 重管理はしんどいので,
いったんここに書いたコードは更新しない.
最新版コードは直接 GitHub を見てほしい.
時間が経つと動かなくなることもあるだろう.
そのときはご指摘頂けると嬉しい.

Jupyter 起動

ターミナルなりコマンドプロンプトなりを立ち上げて次のコマンドを実行すると
ブラウザで Jupyter が立ち上がる.

$ cd some_directory
$ jupyter notebook

some_directory は適切なディレクトリ名を打つこと.
ターミナルやコマンドプロンプトが嫌な方は,
ここにある runjupyter.bat か
runjupyter.command を適切なディレクトリに置いてダブルクリックすれば,
そのディレクトリで Jupyter が起動する.

モード

エディタ vi をご存知の方にはお馴染みの機能だ.
コマンドモードとエディットモードがある.

Esc でコマンドモードに戻れるので,
とりあえず何かあったら Esc でコマンドモードに戻ろう.
そのあと h でヘルプを呼び出すといい.

またコマンドモードのときにセルで m を押すと,
そのセルは Markdown モードになる.
つまり普通のテキストファイルのような扱いだ.
Markdown の書式が使えるのが嬉しい.

さらに嬉しいのは MathJax 連携していて LaTeX も書けること.

\begin{align}
\int_{\mathbb{R}^d} f(x) dx.
\end{align}

数学・物理利用にはこれ以上ないほど助かる.

各モードのキーバインドはコマンドモード時に h を押せば
ヘルプが出てくるのでそれを見るのがいい.
基本的には vi 的なコマンド体系だ.
大事なコマンドはまとめておこう.

どちらのモードでも使える

キーバインド 意味
Ctrl + Enter セルを実行
Shift + Enter セルを実行して下のセルを選択
Alt + Enter セルを実行して下に新しいセルを挿入
Ctrl + S notebook を保存

編集モードで使える

コマンド 意味
Esc コマンドモードに移行
Ctrl + Shift + - セルを分割

コマンドモードで使える

コマンド 意味
h ヘルプ
Enter 編集モードに移行
↑ or k 上のセルに移動
↓ or j 次のセルに移動
y / m セルのタイプを変更: y は cell, m は Markdown
a / b 今のセルの上/下にセルを追加
x / c / v 今のセルを cut/copy/paste
dd 今のセルを削除
z 最後の削除を取り消す (undo)
Shift + = 下のセルとマージ

Python のイントロダクション

ここからは GitHub のこのページから ipynb を落としてきて,
実際に Jupyter で実行しながら読むのがいい.

もしかしたら生の ipynb をそのまま落としたいという方もいるかもしれない.
そういう場合はここから落とそう.
もちろん git clone で落とした方がいいとは思うけれども,
あなたが数学サイドから入ってきたなら Git には不慣れなこともあるだろう.

基本的に Jupyter 上で賄う予定なので,
このミニ講座内で直接 IPython を実行することは少ないだろう.
ただ実践の場で IPython でちょこちょことコード実行することもあるはずだ.
Jupyter 利用と大きくは変わらないと思っているが,
そういう場合の参考として IPython 用の注意もいくつか書いてある.
そちらもぜひここを参照してほしい.

2 系で解説されているもののドットインストールを見て勉強するのもいいだろう.

 # まずは Hello, World! から
print("Hello, World!") # Jupyter 上で入力するとわかるが括弧やクオートが自動で両方入る

結果は次の通り.
ちなみにこの結果は print の部分で出力した内容だ.
以下同じなのでそのように読んでほしい.

Hello, World!

数学関係の話をするのだからまずは四則演算を確認したい.

 # 計算もできる

 # かけ算
print(2*2)     # 演算子の前後は空けなくてもいい

 # 割り算
print(5 / 2)   # 演算子の前後は空けてもいい

 # 切り捨て割り算
print(5 // 3)

 # あまり
print(5 % 3)

 # a の b 乗
print(5 ** 3)

出力結果は次の通り.

4
2.5
1
2
125

あまり使うことはないと思うけれども,
文字列のエスケープも簡単に説明しておこう.

 # 文字列のエスケープ
print("Hello \"world\"")             #  ダブルクオートでくくると文字列の中のダブルクオートをエスケープする必要あり
print("A list:\n* item 1\n* item 2") # \n は改行
print("C:\\path\\on\\windows")       # バックスラッシュ自体のエスケープ
print(r"C:\path\on\windows")         # r"" は生リテラル (raw literal)

出力結果は次の通りだ.

Hello "world"
A list:
* item 1
* item 2
C:\path\on\windows
C:\path\on\windows

リスト

numpy, scipy を使うなら ndarray がメインになるのであまり使わなさそうな印象がある.
しかし sympy だとまた違うかもしれない.
何にしろ Python としては基本的で大事なので紹介しておく.
数学での利用法としては数をたくさん叩き込むのに使える.
Haskell と違って形式的にでも無限リストを作れない (はず) なので,
無限に続く数列は作れない.

sympy との絡みでどうなっていくか,
それは今後 sympy を勉強していく中で見極めていきたいところ.
numpy, scipy 利用時はなるべく ndarray で片付けるべき,
というところだけ理解している.
それ用のコードも順次公開していきたい.

items = [3, 4, 5, 7, 6]
print(items)
print(len(items)) # リストの長さ
print(items[0])   # リストの要素を取得: 0 始まり
print(items[-1])  # マイナスにすると後ろから数えて取得
print(items[0:4]) # 複数要素を一気に取得: 第2引数の扱いに注意
items.append(8)   # 要素追加:破壊的に追加
print(items)

print("\nrange の出力") # Python3 ではリストではなくイテレータで返る
print(range(10))
print(range(1, 11))
print(range(0, 30, 5))
print(range(0, 10, 3))
print(range(0, -10, -1))
print(range(0))
print(range(1, 0))

<!-- リストを操作する関数 -->
print(sum(items))

他のコンテナ

タプル, 辞書, 集合がある.
集合は数学利用もあるのでは? と思ったかもしれない.
ただ数学用途にはいろいろと足りないことがある.
numpy にも集合関係のメソッドはある.
しかし私が注目しているのは sympy での集合関係のメソッドだ.
こちらはある程度の数学利用に耐える内容という印象がある.
もちろんそのうちきちんと紹介する.

まずタプル, 辞書, Python 標準の集合を見てみよう.

mytuple = (1, 2, 3)
print(mytuple)
print(mytuple[0])

 # 辞書: キーと値のペア
mydict = {'a': 1, 'b': 2, 'c': 3}
print('a:', mydict['a'])
 # キーのリストを取得
print(mydict.keys())
 # 値のリストを取得
print(mydict.values())

 # 集合: 数学の集合と同じで重複は排除
myset = set([1, 2, 3, 2, 1])
print(myset)

結果は次の通り.

(1, 2, 3)
1
a: 1
dict_keys(['c', 'a', 'b'])
dict_values([3, 1, 2])
{1, 2, 3}

ループ

いわゆる for だ.
Python でも for がある.
while もあるがここでは省略.

a = [5,6,7,8,9]

<!-- 要素だけ取る -->
for x in a:
    print(x)

print("\nenumerate の出力")
<!-- キーと値を両方取得 -->
for k, v in enumerate(a):
    print(k, v)

出力は次の通り.

5
6
7
8
9

enumerate の出力
0 5
1 6
2 7
3 8
4 9

リスト内包表記

すぐにわかる必要はない.
数学の集合の記法っぽく書けるのでそれがはまるところでは見やすくなる.
for で同じことがやれるので,
まずは for で書けるようになることを目指そう.

a = [5,6,7,8,9]
b = [x**2 for x in a if x % 2 == 0] # 偶数だけ取得してさらに 2 乗する
print(b)

結果は次の通り.

[36, 64]

条件分岐

これももちろん if 関係.
Python では if, elif, else を使う.
elif がかなり特殊な書き方なので注意しよう.

a = [1,2,3]
for x in a:
    if x % 3 == 1:
        print("3 で割って余り 1")
        print(x)
    elif x % 3 == 2: # elif という気持ち悪い記法
        print("3 で割って余り 2")
        print(x)
    else:
        print("3 で割り切れる")
        print(x)

結果は次の通り.

3 で割って余り 1
1
3 で割って余り 2
2
3 で割り切れる
3

関数

関数を定義できる.
数学の関数よりも広い意味で使われている.
数学の関数をきちんとイメージできるならとりあえずそれでいい.
実際そういう使い方もしていく.
専門家には怒られるだろうが,
上でも少し触れた「メソッド」もとりあえず関数だと思っておいてほしい.

def is_even(number):
    """Return whether an integer is even or not.""" # 3 つのクオートは複数行コメント
    return number % 2 == 0

print(is_even(1))
print(is_even(2))
print(is_even(3))
print(is_even(4))

結果は次の通り.
True, False はいわゆる真偽値.
真偽値という概念があるのだ.

False
True
False
True

以下 IPython

IPython を単独では使わない.
しかし Jupyter が裏で使っている.
Jupyter を活用していく予定なので必然的に使うことになる.

そしてすごいことに Jupyter 上からコマンド実行できる.
Unix コマンド前提なので以下のプログラムは素の Windows では実行できないようだ.
Windows10 の Ubuntu の bash なり git bash なり msys2 なりを入れておけばおそらく実行可能(未検証).

パスが通っていることが前提だが,
ターミナルで ipython と打てば起動する.
「パス」がわからない方は無視しよう.
動くならそれでいい.

$ ipython

Jupyter 上では以下の通り直接実行できる。

%pwd # 以下の結果は私の環境で実行した場合の結果: 人によって変わる

私の場合は次のような出力結果になった.
どうなるかはあなたの実行環境次第だ.

'/Users/phasetr/codes/mathcodes/jupyter'

Unix コマンド実行結果.

%ls -l

結果は次の通り.

total 600
-rw-r--r--  1 phasetr  staff   35589  8 17 22:37 fundamentals.ipynb
-rw-r--r--  1 phasetr  staff    5987  8 14 20:15 math_simple_calculation.ipynb
-rw-r--r--  1 phasetr  staff  260296  8 17 22:38 math_simple_graph.ipynb

コマンド実行結果を Python の変数に入れる

細かく対話型シェルを使って調べているとき,
コマンド実行結果を簡単に Python の変数に入れられるのはかなり便利.
この辺はある程度プログラミングをやっているとわかる.
この Jupyter 講座のメインは数学,
特にまずは中学・高校の数学と sympy を主軸に据えていくので
まだあまりご利益を感じるような場面はない.

ただあなたが統計関係で使っていきたいと思うなら,
ちょこちょこと IPython でコマンド実行する機会もあるだろうし.
そういう場合には便利だろう.

files = !ls -1 -S | grep test # ! をつけるとコマンド実行してくれる
print(files)

結果は次の通り.

['test1', 'test2', 'test3']

よくあるやつだが _ で前の出力が取れる.

 # IPython では _ で前回の出力が取れる
%pwd
print(_*2)

出力結果は次の通り.
「/Users/phasetr/codes/mathcodes/jupyter」が 2 回くり返されていることに注意しよう.

/Users/phasetr/codes/mathcodes/jupyter/Users/phasetr/codes/mathcodes/jupyter

他の言語の実行

純粋な IPython 内では次のコードが実行できる: もちろん Haskell (GHCi) インストール済みの場合.
IHaskell や IRuby もある.

#%%script ghci
#putStrLn "Hello, World"

出力結果は次の通り.

GHCi, version 8.0.1: http://www.haskell.org/ghc/  :? for help
Prelude> Hello, World
Prelude> Leaving GHCi.

Jupyter からファイルの読み書きもできる

IPython からやれるのは当然だ.
これが Jupyter 上からもやれるのが割とすごい.

%%writefile myfile.txt
Hello world!

実行結果は次の通り.
既に myfile.txt があったのでこういう出力になっている.

Overwriting myfile.txt

ここからいくつか Unix コマンド実行が続く.

<!-- 前のセルからの続き -->
!more myfile.txt
Hello world!
[?1l>
<!-- 前のセルからの続き -->
!rm myfile.txt
!ls -l
rm: myfile.txt: No such file or directory
total 32
-rw-r--r--@ 1 phasetr  staff  16035  8 13 21:35 fundamentals.ipynb
-rw-r--r--@ 1 phasetr  staff      0  8 13 21:09 test1
-rw-r--r--@ 1 phasetr  staff      0  8 13 21:09 test2
-rw-r--r--@ 1 phasetr  staff      0  8 13 21:09 test3
!head -n5 t # ここで tab を押すと補完候補が出る: Jupyter 上でも出る。

iframe で YouTube の動画の呼出もできてしまう.
Jupyter 上で表示してくれる.
これが本当に素敵.
本当にいい notebook.

<!-- GUI 系のことだってできてしまう -->
from IPython.display import YouTubeVideo
YouTubeVideo('AyJI5XyMQ9M')

実行結果は次の通り.

    <iframe
        width="400"
        height="300"
        src="https://www.youtube.com/embed/AyJI5XyMQ9M"
        frameborder="0"
        allowfullscreen
    ></iframe>

インタラクティブなこともできる

グラフ描画のところでも紹介している。
セルを実行すると Jupyter 上で入力ボックスが出て入力待ちになり,
その入力を受け取ってプログラム実行してくれる.

from ipywidgets import interact
@interact(x=(0, 10))
def square(x):
    print("The square of %d is %d." % (x, x**2))

実行結果は次の通り.
ぜひ Jupyter を起動してやってみてほしい.

The square of 5 is 25.

IPython でのファイル読み込み

以下のセルは実行すると本当にファイルができるので注意すること.

<!-- 準備のためにディレクトリ・ファイル作成 -->
#!mkdir subdir
!cd subdir; touch test1.txt test2.txt test3.txt test1.org test2.org
!cd subdir; ls -l

実行結果は次の通り.

total 0
-rw-r--r--  1 phasetr  staff  0  8 14 12:56 test1.org
-rw-r--r--@ 1 phasetr  staff  0  8 14 12:56 test1.txt
-rw-r--r--  1 phasetr  staff  0  8 14 12:56 test2.org
-rw-r--r--@ 1 phasetr  staff  0  8 14 12:56 test2.txt
-rw-r--r--  1 phasetr  staff  0  8 13 23:16 test3.org
-rw-r--r--@ 1 phasetr  staff  0  8 14 12:56 test3.txt

? でヘルプを出してくれる.

import networkx
<!-- 変数名の後に ? をつけるとヘルプ的なものが出る -->
networkx.Graph?
<!-- 他にも %pdef, %pdoc, %psource, %pfile などがある -->

どこまで意味があるかは微妙だが,
Jupyter でコードを書いて,
そのコードを Python のスクリプトに書き出せる.

%%writefile filelist.py
<!-- coding: utf-8 -->
import sys
import os
<!-- コマンドライン呼び出しの第 1 引数として検索するディレクトリを指定 -->
if len(sys.argv) > 1:
    directory = sys.argv[1]

<!-- 該当ディレクトリ内の全てのディレクトリをリストアップ -->
files = os.listdir(directory)
<!-- 拡張子を切り捨ててファイル名だけ取り出す -->
identifiers = [file.split('.')[0] for file in files]
<!-- set で重複を取り除いてソートする -->
names = sorted(set(identifiers))

出力結果は次の通り.

Overwriting filelist.py

Jupyter 上から作ったスクリプトを実行できる.

<!-- スクリプト実行 -->
%run filelist.py subdir
print(names)

そして実行結果.

['test1', 'test2', 'test3']

次回予定

最初は numpy, scipy を中心にしていこうと思っていた.
微分方程式をゴリゴリ解いてみたいと思っていたのだ.

しかし中高くらいの数学からやり直したい需要が大きいらしいことを知った.
その目的にはむしろ Sympy が役に立つ.
そこで Sympy と中高数学くらいのところを狙ってやっていこうと思っている.
次回も楽しみにしていてほしい.

ご興味ある方はぜひ継続的にチェックしてほしい.


中高の数学の復習から専門的な数学・物理までいろいろな情報を発信しています.
中高数学に関しては自然を再現しよう役に立つ中高数学 中高数学お散歩コース
大学数学に関しては現代数学観光ツアーなどの無料の通信講座があります.
その他にも無料の通信講座はこちらのページにまとまっています.
ご興味のある方はぜひお気軽にご登録ください!

  • このエントリーをはてなブックマークに追加
  • LINEで送る

関連記事

  • コメント (0)

  • トラックバックは利用できません。

  1. この記事へのコメントはありません。

このサイトについて

数学・物理の情報を中心にアカデミックな話題を発信しています。詳しいプロフィールはこちらから。通信講座を中心に数学や物理を独学しやすい環境づくりを目指して日々活動しています。
  • このエントリーをはてなブックマークに追加
  • LINEで送る

YouTube チャンネル登録

講義など動画を使った形式の方が良いコンテンツは動画にしています。ぜひチャンネル登録を!

メルマガ登録

メルマガ登録ページからご登録ください。 数学・物理の専門的な情報と大学受験向けのメルマガの 2 種類があります。

役に立つ・面白い記事があればクリックを!

記事の編集ページから「おすすめ記事」を複数選択してください。