PythonのTutorials - Applications

  Pythonはさまざまな分野のアプリケーションで使われている、極めてパワフルな動的プログラミング言語です。機械学習、ディープ・ラーニングやデータサイエンスなどの分野では必須の言語となっています。ロボティクスで使用されるシングルボード・コンピュータのRaspberry Piでは組み込み言語として必須の役割をします。

  Pythonをインストールしていること、Jupyter Notebookを用いることを前提にしています。したがって、Python及びJupyter Notebookのインストールのページを読んでいることを前提にします。

 このページに掲載されるスクリプト類の動作は、anaconda をインストールしたMacOS10.12及びUbuntu 16.04で実証しています。anaconda をインストールしたWindowsでも問題なく作動すると思います。 Ubuntu Mate をインストールしたRaspberry Piで'ipython' を使用するときは、

 

$ sudo apt install ipython3

とpython3 用の'ipython3' をインストールします。'$ ipython3' と入力して、python3 を起動します。Raspbian Stretch をインストールしたRaspberry Piでは、デスクトップ画面のプログラミング・メニューバーからpython3(IDLE)を起動できます。Jupyter notebookをインストールできない場合には、スクリプトに名前をつけて(例えば、example_script といファイル名で)、一旦保存してから、スクリプトの保存されているディレクトリに移動して、'python3 example_script' とコマンドを入力・実行してください。

(Last updated:2018/8/18)

関連記事
Python及びJupyter Notebookのインストール
RaspiへのUbuntu Mate 16.04のインストール
Raspbian OS のインストール
Deep Learningと人工知能
OpenCVで画像処理/Mac
スマホでpythonを活用するためのページ GitHub repositories

**************************************************************
Pythonの基礎的文法
**************************************************************

 まず、ipython を用いてpyhton3を起動します。以下のような表示となります。

MacBook-Air:~ koichi$ ipython
Python 3.6.3 |Anaconda custom (64-bit)| (default, Oct  6 2017, 12:04:38) 
Type 'copyright', 'credits' or 'license' for more information
IPython 6.1.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]: 

In [1] の後ろにコマンドを入力します。すべてのコマンドの入力では英文入力に切り替えてください。最初に、

In [1]: x=’Hello World’


と入力して下さい。次のコマンドライン(In [2])が出ます。そこで

In [2]: print(x)


と入力して下さい。xの内容であるHello Worldが表示されます。

 Pythonの命令文や関数が処理できるデータは数値データと文字データです。これらの処理対象データを一括してオブジェクトと呼びます。オブジェクトを処理する方法を指示するのが命令文であり、関数である。数値データや文字データに操作を加えるためには、これらのオブジェクトを区別して保存する入れ物(器)が必要で、この入れ物(器)に名前(名称)をつける必要がある。名前をつけた入れ物(器)が変数と呼ばれる。

 x=’Hello World’という命令文は、xという名称の入れ物(変数)にHello Worldという文字データを格納しなさいと指示している。x=”Hello World”と書いても同じです。引用符’…‘(”… “)はオブジェクトが文字データであることを指定している。数値データの場合は、x=2.46 などと直接に書きます。print(x)は変数xの内容をウインドウに印字することを指示しています。

 変数を処理するに当たり、使用可能は四則演算の演算子は以下の通りです。加算をさせるときは、 + を使用、引き算をするときは – を、掛け算をするときは * を、割り算をするときは / を、累乗を計算するときは ** を使う。(なお、excelの表計算関数では累乗は ^ を使うので、注意し下さい)オブジェクトが数値データのときは、数値計算そのものです。

 オブジェクトが文字データのとき、様相は相当異なります。例えば、

In [3]: x=’Hello World.’
In [4]: y=’Good Day!’
In [5]: z=x+y
In [6]: print(z)

  と入力すると、’ Hello World. Good Day!’とシェル・ウインドウに計算結果が表示される。確認してみて下さい。 pythonの終了は

In [7}: quit()


と入力します。

  Pythonの基礎を知るために、オブジェクトの型の種類について若干説明します。変数に単一の数値列、文字列を格納することは単純で分かり易いが、一つの変数に複数のデータを格納できればより便利さが増す。数学でいう集合を考えると分かり易い。複数のデータを順番に配列して格納した変数をリスト型という。リスト型変数はデータを一列に並べたオブジェクトで、

a=[1.0,2.0,3.0,4.0]


の形式で、各データをコンマ','で区切って順番に並べて、鍵括弧[]で括ります。文字データも同じように、

b=[‘spam’, ‘eggs’, 100, 1234]


と定義します。リスト内の配列の番地(インデックス)は0から始まる(1からではないので、注意が必要)。番地0には’spam’、番地1には’eggs’、番地2には数値100となっている。だから、変数bのインデックス0に対応するデータは’spam’、インデックス2に対応するのは数値100です。インデックス0の内容をb[0]、インデックス1の内容をb[1]と書く。だから、

print (b[1])


と入力すると、’eggs’とコンソールに表示される筈です。以上をやってみて下さい。これができれば、インデックス番号を指定して、その内容を入れ替えることが簡単にできます。

a[2]=20.0


とデータを入れ替えて、変数aの内容を印字してみて下さい。

a[2]=a[2]+20.0


としたらどうなりますか?面白いですね。

 リスト型変数の内容を配列番地(インデックス)を利用して、様々なデータの処理を行うことをスライシングという。

x = [1.0,2.0,3.0,4.0,5.0]


としたとき、この変数の中から幾つかの要素だけを取り出したい、例えば、配列インデックス1からインデックス2までのデータを取り出したいときには、

x[1:3]


とします。1:3の意味は、インデックス1から3未満までの要素を取り出すことを意味する。インデックスiからjまでの要素を取り出すときは、i:j+1 とおきます。要注意です。インデックスの指定を省略することができます。例えば、

x[:4]


とおくと、: の前の0が省略されていると見なされる。この結果、[1.0,2.0,3.0,4.0]が取り出され、印字される。反対に、

x[2:]


とおくと、インデックスの2から最後の配列要素まで取り出される。[3.0,4.0,5.0]と表示される。データ数を増加させることも容易にできる。

y=[0.1,0.2]
z=x+y
print (z)

とおくと、zの要素が[1.0,2.0,3.0,4.0,5.0,0.1,0.2]となっていることが確認できる。要素を削除するときには、del文を使う。例えば、

del z[2]
print (z)


とおくと、変数zの中から3.0が削除されて、データの数が減っていることが確認できる。zの中で最大値を取り出す関数はmax(z)であり、最小値を取り出す関数はmin(z)である。ちなみに、

max(z)


とおくと、5.0と表示される。関数の前に余計な空白をおくと、エラーとなります。データの数、つまり変数に格納されている要素数を調べるには len(z) と入力します。

 データ処理では、要素を並べ替える必要性が頻繁に起きます。Pythonでは、このような操作はオブジェクト変数の後ろに、メソードと呼ばれる命令文(関数)を付けて処理される。例えば、数値を小さい順から並べ替えるに z.sort() とおくと、zの内容が小さい順から配列される。zの内容は並べ替えられているので、print (z) とおいてみると確認できる。命令文sort()の括弧()は必ず付けて下さい。大きい順から並べ替える方法は、z.reverse()と入力すれば良い。試してみて下さい。

 多次元配列及び辞書型変数も活用できますが、ここでは簡単なリスト型変数の処理についてまでにします。  以下の例を見てください。このスクリプトをNotebookにコピペして、実行[run cells]してください。

# how to use the index

name = ["cheese", "John"]
print (name[1],name[0])

x=["spam","spam","spam","spam","spam","egg","and","spam"]
print (x[5:7])
print (x[5],x[6],x[7])


変数の要素の番地は1からではなく、0から始まります。この例から変数の構造をよく理解できます。python インタープリーは、各行を上から順番に読み込んで実行します。文法上の誤りが見つかった行でエラーを出して、そこで実行を停止します。#のついた行はコメント文を表現します。python インタープリーは#の後から行末までをコメントと認識して、読み込みをパスします。見易のために、空白の行を使います。

 再度、配列番地の理解を復習しましょう。オブジェクトのリスト型配列のスライスの働きかたをおぼえる良い方法は、番地が要素と要素のあいだ (between) を指しており、最初の要素の左端が 0 になっていると考えることです。そうすると、 n 個のデータからなる配列中の最後の要素の右端は番地が n となります。x=[a,b,c,d]のとき
|  a  |  b  |  c  |  d  |
0     1     2     3     4

とインデックスは割り振られる。iから j までのスライスは、それぞれ i と付いた境界から j と付いた境界までの全ての文字から成っています。

 次に、場合に応じて処理を振り分ける複合文の書き方について説明します。Pythonでの振り分け処理には、while文、if文、for文があります。以下のフィボナッチ数列の例を見ましょう。

# Fibonacci series:

# the sum of two elements defines the next
a, b = 0, 1
while b < 10:
	print(b)
	a, b = b, a+b


これを実行すると、

1
1
2
3
5
8


と表示されます。この例では、コメントの後に、最初の行に複数同時の代入 (multiple assignment) が入っています:。変数 a と b は、それぞれ同時に新しい値 0 と 1 になっています。この代入は、最後の行でも使われています。代入文では、まず右辺の式がすべて評価され、次に代入が行われます。右辺の式は、左から右へと順番に評価されます。

 while は、条件 (ここでは b < 10) が真である限り実行を繰り返します(ループと言います)。Python では、C 言語と同様に、ゼロでない整数値は真となり、ゼロは偽です。条件式(condition文)には、文字列値やリスト値なども使えます。例で使われている条件式はシンプルな比較です。標準的な比較演算子は C 言語と同様です。 すなわち、 < (より小さい)、 > (より大きい)、 == (等しい)、 <= (より小さいか等しい)、 >= (より大きいか等しい)、および != (等しくない)、です。

 要約すると、while文は以下のような構造をしている。

while condition文 :
(インデントの空白) while-bodyの記述

上記のwhile文は、condition文で記述されている条件が成立している間は、while-bodyで記述された文を実行することを指令している。ループの 本体 (while-body) は インデント (indent, 字下げ) されています。while-bodyの記述はすべて1字以上の空白でインデントされなければならない。インデントは Python において、実行文をグループにまとめる方法です。入力の完了を示すために最後に空行を続けなければなりません。while-bodyでは、全ての行は同じだけインデントされていなければならないので注意してください。通常は、4文字分空けます。半角でtabキーを使います。しかし、全角で空白を入力するとエラーが出ます。

 次に、if文とfor文を使いましょう。以下のコードをNotebookにコピペして、実行してください。

# "if" and "while" sentences
x=15
print(x)

if x < 5 or (x > 10 and x <20):
	print ("the value is ok.")

while x >= 0:
	print ("x is still not negative. x= ",x)
	x = x -1
   
# the "for" sentence
for i in [1,2,3,4,5]:
	print ("This is iteration number.",i)

#Print out the value from 0 to 49 inclusive.
for value in range(50):
	print (value,)
	

この例から、振り分け処理の仕方が解ると思います。range(50) は0 から 50 未満、つまり、49までの数値列を意味します。なお、 range(5,50) とすると、5 から 50 未満までの数値列を表現できます。

 ここで、if文の構文を詳しく見て見ましょう。 if文は以下のように使用されます。

if condition-1 :
 if-bodyの文
elif condition-2:
 elif-bodyの文
else:
 els-bodyの文

もしcondition-1が真であるならば、if-bodyの文を実行する。condition-1が成立しないとき、condition-2が成立するならば、els-bodyの文を実行する。condition-1もcondition-2も両方とも不成立ならば、els-bodyの文を実行する。elifはelse ifの省略形である。elif文とelse文は省略可能である。以下のように、スクリプトファイルを作成して、保存して下さい。

# "if" sentences
x=int(input('整数を入力して下さい: '))
if x < 0: 
  x = 0  
  print('負の整数なので、ゼロとした') 
elif x == 0: 
  print('ゼロ') 
else : 
  print(x,'は正の整数です') 


ここで、int(..) は数値を整数にする命令であり、input(.. ) は '整数を入力して下さい: ' とターミナルに表示して、キーボードからの入力を受け取るコマンドです。

   同一の処理を何度も繰り返すとき、この処理方法を関数として定義しておいて、使用するごとにこの関数を呼び出して使うことは便利である。関数を定義する方法について説明する。関数を定義する形式は以下の通りです。

def function_name(arg_list):
(インデント) function_bodyの文

defで始まる第1行目function_name:はfunction_nameという名称の関数を定義する文である。function_nameは、例えば、fibonachiというような英文の適当な名前をつけて良い。ただし、Pythonで組み込み関数で使用されている関数名(予約語、例えば、cos、logなど)は使用できない。引数(arg_list)は、後の例で説明されるように、関数で使用される変数のリストを入力する。

 関数の定義の仕方について理解するためのスクリプトを下に示します。

# Fibonachi series
def fib(n):
	a,b=0,1
	while b < n:
		print(b,)
		a,b=b,a+b
	return

fib(2000)


'def fib(n):' 文は関数名fibで関数を定義し、引数の変数がnであることを記述します。function_bodyの文 はreturn文で終わります。最後の行にある fib(2000)は、上で定義した関数 fib を呼び出して、変数の値をn=2000とした時の関数値を求めています。このスクリプト作成し、保存して下さい。このスクリプトを開いて、実行させて下さい。

1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597
という結果が返されれば、成功です。また、関数スクリプトを独立したスクリプトとして、つまり、モジュールとして作成することもできます。この場合、通常のスクリプトファイルと同様に、関数スクリプトを拡張子.pyを付けて保存します。詳しくは、Python公式ホームページのドキュメントを参照してください。日本語の解説は 日本語のホームページhttps://www.python.jp/にあります。
  

**************************************************************
NumPy/SciPy/Matplotlibの使い方
**************************************************************

NumPy/SciPy/Matplotlibの使い方を説明します。これらのモジュールはすべてインストールされていることを前提にします。anaconda をインストールした時は、すべて一括でダウンロードされています。ここでは、数値計算やデータ処理の方法とグラフィックの使用法について説明します。NumPy,SciPyのドキュメントのページはこの
英文公式ホームページにあります
Numpyのライブラリに格納されている各種のモジュールを利用するためには、プログラムの始めに、以下のような文を記述しなければならない。

In [1]:import numpy as np
In [2]:import scipy as sp

'import numpy as np' は numpy 内にあるすべての関数を np のメソッドとして使用できる状態にする。'scipy' の 'import' についても同様です。NumPy に内蔵されている基本的なモジュールは、線形代数(linalg)、確率分布(random)、離散型フーリエ変換(fft)、マトリックス変換などである。NumPyには、通常の数学的関数、例えば、三角関数、指数・対数関数、簡単な統計計算などが組み込まれていて、簡単に利用できる。組込み関数として、三角関数関係では、sin(), cos(), tan(), arcsin(), arccos(), arctan(), sinh(), cosh(), tanh()など、対数、指数関数関係では、exp(), log(), log10(),等が使用できる。例えば、sin (pi/2)の計算は

In [3]:np.sin(pi/2)


とすれば、答えは1.0と返されます。指数関数はexp(..)、自然対数はlog(..)という組込み関数を使用できる。 numpyの組み込み関数 'array' を使って、4つの数値が要素となっている配列データ(1,2,3,4)を内容とする変数(オブジェクト)を定義してみましょう。さらに、(10, 20, 30, 40)という1次元ベクトル(横ベクトル)をAとして定義しましょう。

In [4]:a = np.array([1,2,3,4]) 
In [5]:A = np.array([10,20,30,40])


と入力すれば良い。

 行列計算に必要な組込み関数および操作方法について説明します。行列の積などの計算をするためには、数値をマトリックスの形式で表現する必要があります。Scipy/Numpyでは、n次元配列表現(ndarray)と呼ばれる、一般的な配列表現(リスト型変数)を採用しています。マトリックス配列(2次元配列)はそのスペシャル・ケースになる。行列を定義したいときには、例えば、

In [5]:B = np.array([[1.0, 1.0],[0.0, 1.0]]) 
In [6]:C = np.array([[2.,0.],[3.,4.]]) 


とすればよい。ちなみに、行列B、Cは
B=1.01.00.01.0,  C=2.00.03.04.0
となっている。配列を作成する組込み関数は、array、range、arange、linspaceに限定されません。以下のような組込み関数が用意されています。

In [7]:D = np.zeros((3,4)) 
In [8]:E = np.ones((3,4)) 
In [9]:F = np.eye(4) 
In [10]:G = np.diag((3,4)) 
In [11]:H = np.empty((3,4)) 
In [12]:D.np.ndim 
In [13]:E.np.shape 


zeros((n,m)) はすべての要素をゼロとするn行m列の行列を作成し、ones((n,m)) はすべての要素と1とするn行m列の行列を作成、eye(n) はn行n列の単位行列を作成する。これらはすべて浮動小数点の数値で与えられる。さらに、各変数 ndarray に対して、ndarray.ndim、 ndarray.shape、 ndarray.size、 ndarray.dtype などのような操作をすることができる。

 n次元配列表現では、加算、引き算、乗除の操作は必ず配列の要素ごとの計算になる。だから、行列の和と差の計算は、数値の加算、減算と同じように問題なく計算できる。例えば、

In [19]:B + C 
In [20]:B * C
In [21]:np.dot(B,C)


という計算ができます。注意が必要なのは、行列の積を計算するときである。B * C と入力すると、答えは要素ごとの積になります。通常の行列の積を計算するためには、np.dot(A,B) とNumpyの組の込み関数を用いて入力する必要があります。Numpyで使用可能な組込み関数の一覧表は
このpdfファイルにあります。
MATLAB/OctaveおよびRとの対比になっています。

  次に、Matplotlibの使用法について説明します。英文公式ホームページは
https://matplotlib.org/にあります。

  スクリプトの始めに 'matplotlib.pyplot as plt' と記述すると、pltという略称名の下でmatplotlibに組み込まれている様々なグラフィック機能の命令が利用できます。言い換えると、matplotlib.pyplot というモジュール名の代わりに plt というモジュール名を用いることを宣言している。ここで、三角関数のグラフを描くソース・コードを書いたテキスト・ファイルを作成する方法を説明します。以下のようなテキスト・ファイルを作ります。plt.plot(...) は、モジュール matplotlib.pyplot に組み込まれたプロット関数 plot を表現します。モジュールmatplotlib.pyplot に組み込まれた関数 f_n を用いるときは、plt.f_n という形式で命令文を記述します。

#an example of matplotlib usage 

import  numpy as np 
import matplotlib.pyplot as plt  

t = np.arange(0.0, 2.0, 0.01) 
s = np.sin(2*pi*t)

plt.plot(t, s)
plt.title('sin(s)') 
plt.xlabel('time (s)')  
plt.ylabel('volts (mV)')         
plt.grid(True) 
plt.show()


このファイルを拡張子.pyを付けて保存する。または、Jupyter Notebookにコピペします。このプログラムを実行すると、sin関数のグラフが描かれます。import numpy as np は、numpy 内のすべての組み込み関数を np という略称で使用するという宣言です。np.arange(0.0, 2.0, 0.01) は0.0 から 2.0のまでの数値を刻み幅 0.01 で数列化する numpy の組み込み関数です。最後の命令 plt.show() はグラフをデスクトップに表示させるために必要で、これを書かないとグラフは表示されません。

 plt.grid(True) はグラフのグリッド線を表示させるための命令です。グリッド線を表示させないときは、この命令を削除すればよい。plt.plot(t,s) は横軸にt、縦軸にsを描いたグラフを出力させる命令です。変数tは数直線[0,2]上に、間隔距離が0.01で並んだ数値からなる配列で、変数sはそれらの200個の数値に対応する1次元配列となっている。タイトル、横軸ラベルまたは縦軸ラベルの表示の仕方は説明を必要とするまでもないでしょう。以下のグラフは、実際にこのソース・コードを実行した場合の結果です。


ファイルを保存して、[File]-[Close and Halt]とクリックして、NoteBookを終了してください。最後に、ターミナルで[Ctrl+c]を入力して、Notebookのカーネルも閉じます。

matplotlibの出力グラフをJupyterのセル上に表示させる為には、スクリプトの第1行目に

%matplotlib inline 


と記述します。上の例で見た通り、この記述がなくても表示されるようです。
 以下にあるスクリプトファイルをコピペして、実行してみて下さい。

結果はこうなります。


Matplot_Pie__demo
  次のスクリプトをNotebookにコピペして実行してください。

以下のような面白いアニメーション・グラフが描けます。
  


Matplot_Path_patch_demo


  次の例はグラフに数式を書き込むことです。数式の書き込みは当然のことながらLaTexの書式を使用します。以下のスクリプトをコピペして実行してください。


結果はこうなります。


Matplot_Tex__demo


  以下の例は一つのグラフに2つのsubplotを描いた例、及び、3次元のグラフを描いた例です。ソースコードがダウンロードできるようになっていますので、それらをコピペして実行して見てください。


Subplot_demo_demo ダウンロード用source code py.ファイル


Matplot_Surface3d_demo ダウンロード用source code py.ファイル


Matplot_Surface3d3_demo
ダウンロード用source code py.ファイル


Pythonを用いた経済成長モデルのシミュレーション

経済成長のSolowモデルのシミュレーション
  以下は、マクロ経済学の知識が要求されます。興味のない読者はスキップしてください。経済学の経済成長理論における基本モデルのシミュレーションを取り上げます。最初に、新古典派モデルの典型であるSolowモデルを考えます。このモデルではマクロ経済で産出される財は均質な財と仮定されています。いわゆる1部門経済成長のモデルです。シミュレーションのスクリプトは以下の通りです。
このスクリプトをコピペして、runすると、3回のシミュレーションが実行され、以下のグラフが得られます。

Solow_model_demo

DSGEモデルのシミュレーション:Hansen model
  次に、1980年代に登場した内生的経済成長理論の基礎となる新新古典派の経済成長モデルを取り上げます。Romer、Lucas、Barro達が代表的な理論家ですが、その初期の理論となるHansenモデルを考えます。シミュレーション用のスクリプトは結構な長さになります。以下はマクロ経済学の知識が要求されますので、行列の固有値(線形代数)に関する知識がない読者はスクリプトの内容はスキップしてください。中身を具体的に理解したい読者はReal Business Cycleに関するテキストを、例えば、George McCandless(2008), The ABCs of RBCs: An introduction to Dynamic Macroeconomic Models, Harvard University Press. を参照してください。 このsource code py.ファイルです。

これをダウンロードして、実行してください。その結果はこうなります。

Hansen_model_demo

Networkxを用いた社会的ネットワークの分析

Pythonのsite-packageの一つ、Networkxを使おう!
慣れれば意外に簡単です。組み込み関数のgraph generatorを使って、ランダムネットワークを描いてみました。
Erdos_Renyi model_demo


同じく、組み込み関数のgraph generatorを使って、スモールワールド・ネットワークを描いてみました。
Watts_Strogatz model_demo


15世紀フィレンツェにおける結婚を介した門閥ネットワークを描いてみました。中心の家系はMedici家です。

Medici家の門閥ネット_demo Source code py.ファイル


Networkxを用いた社会的経済的ネットワークの分析に関するページは ここを見て下さい。

トップページに戻る