1. 数学の基礎とPythonによる表現
code: demorran1.py
print(P, Q, not P, not Q, P and Q,
not(P and Q), (not P) or (not Q))
code: planet.py
C = {'Earth': '3rd', 'Mars': '4th', 'Jupiter': '5th'}
for x in C:
print(f'{x} is the {Cx} planet in the solar system.') print()
for x in sorted(C):
print(f'{x} is the {Cx} planet in the solar system.') code: matrix.py
for i in range(3):
for j in range(3):
print()
code: lena1.py
import PIL.Image as Img
from numpy import array
im1 = Img.open('lena.png').convert('L')
im1.thumbnail((100, 100))
A = array(im1)
m, n = A.shape
B = A < 128
h = max(m, n)
y0, x0 = m / h, n / h
def f(i, j):
return (x0 * (-1 + 2 * j / (n - 1)), y0 * (1 - 2 * i / (m - 1)))
P = [f(i, j) for i in range(m) for j in range(n) if Bi, j] with open('lena.txt', 'w') as fd:
fd.write(repr(P))
https://gyazo.com/fed8fe9d68774d40bec9ad2e99590aea
画像の第$ i行第$ j列の画素を、$ x-$ y座標平面の$ -1\leqq x\leqq 1,\ -1\leqq y\leqq 1である点$ \left(x, y\right)に対応させる関数$ fを定義します。
$ f\ :\ \left(i,j\right)\ \mapsto\ \left(x_0\left(-1+\dfrac{2j}{n-1}\right),\ y_0\left(1-\dfrac{2i}{m-1}\right)\right)
$ fによって
$ \left(0,0\right)\ \mapsto\ \left(-x_0,\phantom{-}y_0\right)
$ \left(0,n-1\right)\ \mapsto\ \left(\phantom{-}x_0,\phantom{-}y_0\right)
$ \left(m-1,0\right)\ \mapsto\ \left(-x_0,-y_0\right)
$ \left(m-1,n-1\right)\ \mapsto\ \left(\phantom{-}x_0,-y_0\right)
と変換されます。画像が正方形であれば、即ち$ m=n=100ならば$ x_0=y_0=1ですが、そうでない場合は長辺がちょうど$ -1と$ 1の間に収まるようにします。
code: lena2.py
import matplotlib.pyplot as plt
with open('lena.txt', 'r') as fd:
P = eval(fd.read())
x, y = zip(*P)
plt.scatter(x, y, s=3)
plt.axis('scaled'), plt.xlim(-1, 1), plt.ylim(-1, 1), plt.show()
https://gyazo.com/8100b71b578871fc9b0e5feb0cba0c47 https://gyazo.com/bdb33cd5a1c737a434a83d60a1ac2165
open('lena.txt', 'r')の'r'はファイルを読み込みのためにオープンするという意味です。'r'と'w'を間違えると、既にあるファイルを壊すことになりますので、注意してください。Data = fd.read()でファイルの全データが文字列としてDataに代入されます。numpy.array(eval(Data))は、Dataにある文字列をPythonの式として評価してリストに戻し、さらにそれをアレイにしています。Zは$ xy座標の列であり、Z[: , 0]で$ x座標だけの列、Z[: , 1]で$ y座標だけの列を取り出せます。plt.scatterは$ xy座標平面に点をプロットする関数で、s = 3は点の大きさを指定しています。
複素平面に線図形を描くGUI
code: tablet.py
from tkinter import Tk, Button, Canvas
def point(x, y):
return C.create_oval(x - 1, y - 1, x + 1, y + 1, fill='black')
def PushButton(event):
x, y = event.x, event.y
def DragMouse(event):
x, y = event.x, event.y
Segs-1.append(((x, y), point(x, y))) def Erase():
if Segs != []:
seg = Segs.pop()
for p in seg:
def Save():
if Segs != []:
L = []
for seg in Segs:
for (x, y), _ in seg:
L.append((x - 160) / 160 + 1j * (160 - y) / 160)
with open(filename, 'w') as fd:
fd.write(repr(L))
print('saved!')
filename = 'tablet.txt'
Segs = []
tk = Tk()
Button(tk, text="erase", command=Erase).pack()
C = Canvas(tk, width=320, height=320)
C.pack()
C.bind("<Button-1>", PushButton)
C.bind("<B1-Motion>", DragMouse)
Button(tk, text="save", command=Save).pack()
tk.mainloop()
https://gyazo.com/d3f60ff3ed34e8cfccb14626689d28e0
次は、よく機械学習の実験に使われるMNISTの手書き数字のデータの一部を表示したものです。
https://gyazo.com/3f332f73a4f1775008141a602594301a
train-images-idx3-ubyte.gz: training set images (9912422 bytes)
train-labels-idx1-ubyte.gz: training set labels (28881 bytes)
t10k-images-idx3-ubyte.gz: test set images (1648877 bytes)
t10k-labels-idx1-ubyte.gz: test set labels (4542 bytes)
の四つのファイルがあります。こららをダウンロードして解凍してできたものを、これから作成するプログラムmnist.pyと同じフォルダに置きます。ファイル名をそれぞれ
train-images.bin
train-labels.bin
test-images.bin
test-labels.bin
としておくことにします。train-images.bin(test-images.bin)のファイルには、全部で60,000個(10,000個)の画像があります。各画像のラベル(画像が表す数字)がtrain-labels.bin(test-labels)のファイルにあります。通常、train-*の方が機械学習の学習に使われ、test-*の方が学習結果の検証に用いられます。これらはバイナリファイルですが、どのようなデータ形式となっているかは上のページの最後の方に書いてありますので、それに従って次のプログラムで中身を覗いてみましょう。
code: mnist.py
import numpy as np
import matplotlib.pyplot as plt
N = 10000
with open('test-images.bin', 'rb') as f1:
X = np.fromfile(f1, 'uint8', -1)16: X = X.reshape((N, 28, 28))
with open('test-labels.bin', 'rb') as f2:
Y = np.fromfile(f2, 'uint8', -1)8: D = {y: [] for y in set(Y)}
for x, y in zip(X, Y):
print([len(Dy) for y in sorted(D)]) fig, ax = plt.subplots(10, 10))
for y in D:
for k in range(10):
axyk.tick_params(labelbottom=False, labelleft=False, color='white')
plt.show()
PyX
code: comp.py
from pyx import *
C = canvas.canvas()
text.set(text.LatexRunner)
text.preamble(r'\usepackage{amsmath, amsfonts, amssymb}')
C.stroke(path.circle(0, 0, 1),[style.linewidth.thick, deco.filled(color.gray(0.75))]) C.stroke(path.line(1, -0.1, 1, 0.1))
C.stroke(path.line(-0.1, 1, 0.1, 1))
C.writePDFfile('comp.pdf')
https://gyazo.com/0e540888dcee22a795530965cf8798c6