Python のデモ

by takataka 2018-09-01

Python について

Python は,スクリプト言語と呼ばれる種類のプログラミング言語です.仲間には Perl, Ruby, PHP等がいます.手軽にちょろっと書けるお気楽なプログラミング言語です. 様々な用途のライブラリが提供されているので,手軽にいろんなことができます.それらライブラリの中には,科学技術計算向けなどバリバリにチューンされた高性能なものもあり,下手にC言語で書くよりずっと高速な処理がずっと簡単に書けたりもします.

Python のプログラムは,C言語のようにソースファイルを作って実行することもできますが,ここでは Jupyter Notebook 上でさらに気楽に使ってみましょう.

In [ ]:
hoge = [ 1, 2, 3.1415, 'a', 'hoge', [10, 20, 30]]  # 「リスト」と呼ばれるもの.C言語の配列に似てるような似てないような
hoge[1] = 999
hoge += ['fuga', 'hena']
for x in hoge:   # hoge から一つずつ要素を取り出して表示
    print(x)

NumPy による数値計算

In [ ]:
import numpy as np  # NumPy ライブラリを np という名前で呼び出せるようにインポート
print('NumPy:', np.__version__)  #  NumPy ライブラリのバージョンの確認
In [ ]:
# 2 x 2 行列
A = np.array( [ [ 2, -1 ], [ -1, 1 ] ] )
A
In [ ]:
# @ はベクトル間の内積,行列間の積
A @ A
In [ ]:
# 固有値と固有ベクトルを求める
lam, P = np.linalg.eig(A)  # lam は固有値のならんだ1次元配列,P は固有ベクトルをならべた2次元配列(行列)
print(lam)
print(P)
In [ ]:
# 対角に固有値のならんだ対角行列を生成
Lam = np.diag(lam)
Lam
In [ ]:
# .T は転置行列
P.T
In [ ]:
# 対角化の逆をやってみる. P @ Lam  @ P.T は A に等しくなるはず
Ad = P @ Lam @ P.T
Ad
In [ ]:
# 乱数で 1000 x 1000 の行列 X をつくる
X = np.random.rand(1000, 1000)
X
In [ ]:
# Y = X.T @ X は対称行列
Y = X.T @ X

# 固有値と固有ベクトルを求める
lam, P = np.linalg.eig(Y)
In [ ]:
lam

OpenCV による画像処理

  • OpenCV は,フリーの画像処理/コンピュータビジョンライブラリ. Python からも呼び出せる https://opencv.org/

準備として,以下の画像を blackuni3.png という名前でこのノートブックと同じディレクトリ内に保存しよう. blackuni3.png

In [ ]:
import cv2 # OpenCV ライブラリをインポート
print('OpenCV:', cv2.__version__)  #  バージョンの確認
In [ ]:
# 画像の読み込み
img = cv2.imread('blackuni3.png')
if img is None:
    print('File Not Found')
print(img.shape)  # 正しく読み込めたら, img は NumPy の3次元配列になる
In [ ]:
img2 = 255 - img   # 画素値の反転
img2 = cv2.flip(img2, 1)  # 画像の左右反転.第2引数の値を変えると....
img2 = cv2.resize(img2, (400, 100))   # 幅 400, 高さ 200 にする
cv2.imwrite('hoge.png', img2)  # ファイルに書き出す.拡張子が png だと自動的に PNG フォーマットで保存

うまくいけば,カレントディレクトリ内に hoge.png という名前の画像ファイルができてるはず.表示してみよう.

$ display hoge.png &

SymPy による数式処理

In [ ]:
import sympy as sp
from sympy import *
print('SymPy:', sp.__version__)
In [ ]:
x = Symbol('x')
y = Symbol('y')

$(x+y)^5$ の展開.←のように,Jupyter Notebook の Markdown セルにはLaTeX形式で数式も書ける.

In [ ]:
expand((x+y)**5)
In [ ]:
# 以下の関数を呼んでおくと出力を LaTeX 表記させられる
init_printing()
expand((x+y)**5)
In [ ]:
expand((x+y)**5)

因数分解

In [ ]:
factor(x**5 + 5*x**4*y + 10*x**3*y**2 + 10*x**2*y**3 + 5*x*y**4 + y**5)
In [ ]:
factorint(909201)

$z = \left( \sin^{3}x + \sin{x}\cos^{2}x\right) / \tan{x} $ の簡単化

In [ ]:
z = (sin(x)**3 + sin(x)*cos(x)**2)/tan(x)
simplify(z)
In [ ]:
diff(exp(x**3), x)
In [ ]:
diff(exp(x**2), x, 2)

$e^{x}$ のマクローリン展開

In [ ]:
series(exp(x), x)

$$ \int{(3x^2 - \sin{x})} dx $$

In [ ]:
f = 3*x**2 - sin(x)
integrate(f, x)

$$ \int_{0}^{2\pi}{(3x^2 - \sin{x})} dx $$

In [ ]:
integrate(f, (x, 0, 2*pi))

$$\int_{-\infty}^{\infty} \frac{1}{\sqrt{2\pi}}e^{-x^2/2} dx$$

In [ ]:
integrate(exp(-x**2/2)/sqrt(2*pi), (x, -oo, oo))

連立方程式 $$ \left\{ \begin{array}{ll} 6x-3y-15 &= 0 \\ 5x+y-2 &= 0 \end{array} \right.$$

In [ ]:
f = 6*x - 3*y - 15
g = 5*x + y - 2
solve([f, g], [x, y])

$$ A = \begin{pmatrix} 2 & x & 1 \\ x & 1 & 0 \end{pmatrix}$$

In [ ]:
A = Matrix([
    [2, x, 1],
    [x, 1, 0]
]) 
A
In [ ]:
A.T * A

$$ B = (A^{\top}A + I)^{-1}$$

In [ ]:
B = (A.T*A + eye(3)).inv()
B
In [ ]:
# 検算
simplify((A.T*A + eye(3)) * B)

関数 $f$ の定義, 等式 $ \frac{d^2f}{dx^2}+9f(x) = 1 $ の定義

In [ ]:
f = Function('f')
g = Eq(f(x).diff(x, x) + 9*f(x), 1)

上記の式を $f$ の微分方程式として解く.

In [ ]:
dsolve(g, f(x))
In [ ]:
# 検算
c1 = Symbol('c1')
c2 = Symbol('c2')
h = c1*sin(3*x) + c2*cos(3*x) + 1/9
simplify(h.diff(x, x) + 9*h)