#!/usr/bin/env python # coding: utf-8 # # 1章 Python 入門 # ## 1.3 Python インタプリタ # ※コマンドラインではなくてインタプリタ(REPL や Jupyter notebook 等)上でバージョン確認するには `sys.version` を見れば良い。 # In[2]: import sys # In[3]: sys.version # In[4]: 1 + 2 # ### 1.3.1 算術演算 # In[5]: 1 - 2 # In[6]: 4 * 5 # In[7]: 7 / 5 # In[8]: 3 ** 2 # ※補足:整数除算は `//` 演算子が利用できる。 # In[10]: 7 // 5 # ### 1.3.2 データ型 # In[11]: type(10) # In[12]: type(2.718) # In[13]: type("hello") # ### 1.3.3 変数 # In[14]: x = 10 # In[15]: print(x) # In[16]: x = 100 # In[17]: print(x) # In[18]: y = 3.14 # In[19]: x * y # In[20]: type(x * y) # ### 1.3.4 リスト # In[21]: a = [1, 2, 3, 4, 5] # In[22]: print(a) # In[23]: len(a) # In[24]: a[0] # In[25]: a[4] # In[26]: a[4] = 99 # In[27]: a # In[28]: a[0:2] # In[29]: a[1:] # In[30]: a[:3] # In[31]: a[:-1] # In[32]: a[:-2] # ### 1.3.5 ディクショナリ # In[33]: me = {'height': 180} # In[34]: me['height'] # In[35]: me['weight'] = 70 # In[36]: me # ### 1.3.6 ブーリアン # In[37]: hungry = True # In[38]: sleepy = False # ### 1.3.X タプル # ※データ型の説明中にタプルが出てこなかったので、実例を挙げて説明。 # In[39]: (x, y) # In[40]: type((x, y)) # In[41]: (x, y, 1, 2, 3, "a", True) # In[42]: type((x, y, 1, 2, 3, "a", True)) # ### 1.3.7 if 文 # In[45]: hungry = False # In[46]: if hungry: print("I'm hungry.") else: print("I'm not hungry.") # ### 1.3.8 for 文 # In[49]: for i in [1, 2, 3]: print(i) # ※タプルも `for` 文(の `in` 句)に渡せる。 # In[54]: for i in (x, y, 1, 2, 3, "a", True): print(i) # ### 1.3.9 関数 # In[47]: def hello(): print("Hello World!") # In[48]: hello() # In[52]: def hello(object): print("Hello " + object + "!") # In[53]: hello("cat") # ## 1.4 Python スクリプトファイル # ### 1.4.1 ファイルに保存 # ※Jupyter notebook を利用する場合、新たにテキストエディタを起動する必要はない。 # # + ディレクトリのファイルリストが表示されている画面で、[New]→[Text File] を選択すると、簡易テキストエディタ画面になる。名前を付けて新しいテキストファイルとして保存できる(もちろん `.py` ファイルも作れる) # + ディレクトリのファイルリストが表示されている画面で、テキストファイルを選択すると、↑と同様テキストエディタ画面が開き、編集できる。 # + 短い内容なら、↓のようにすれば notebook 上で直接ファイルを作成(存在すれば上書き保存)することも可能。 # In[56]: get_ipython().run_cell_magic('file', 'hungry.py', 'print("I\'m hungry!")\n') # ※↓`.py`ファイルの内容を表示 # In[58]: get_ipython().run_line_magic('pycat', 'hungry.py') # ※↓`.py`ファイルを実行し結果を表示 # In[124]: get_ipython().run_line_magic('run', '-i hungry.py') # ### 1.4.2 クラス # ※テキストでは `man.py` というファイルに保存して実行とあるが、ここでは直接 notebook にクラスを記述し、各セルで実行 # In[61]: class Man: def __init__(self, name): self.name = name print("Initialized!") def hello(self): print("Hello " + self.name + "!") def goodby(self): print("Good-bye " + self.name + "!") # ※↑ `class` の定義は1つのセル内に全部書く。複数のセルにまたがることは出来ない。 # In[62]: m = Man("David") # In[63]: m.hello() # In[65]: m.goodby() # ## 1.5 NumPy # ### 1.5.1 NumPy のインポート # In[66]: import numpy as np # ### 1.5.2 NumPy の配列の生成 # In[67]: x = np.array([1.0, 2.0, 3.0]) # In[68]: print(x) # In[69]: type(x) # ※ここで質問:「`np.array`と`numpy.ndarray`の違いは?」 # →回答「`numpy.ndarray`は型、`np.array`は`numpy.ndarray`型のオブジェクトを生成する便利なメソッド」 # ### 1.5.3 NumPy の算術計算 # In[70]: x = np.array([1.0, 2.0, 3.0]) y = np.array([2.0, 4.0, 6.0]) # In[71]: x + y # In[72]: x - y # In[73]: x * y # In[74]: x / y # In[75]: x / 2.0 # ブロードキャスト # ### 1.5.4 NumPy の N 次元配列 # In[76]: A = np.array([[1, 2], [3, 4]]) # In[77]: print(A) # In[78]: A.shape # In[79]: A.dtype # In[80]: B = np.array([[3, 0], [0, 6]]) # In[82]: A + B # In[83]: A * B # In[84]: A * 10 # ### 1.5.5 ブロードキャスト # In[85]: A = np.array([[1, 2], [3, 4]]) # In[86]: B = np.array([10, 20]) # In[87]: A * B # ※↑は仮想的に↓と同じ意味、というコード(テキストに載っていないものを説明のために記述) # In[88]: B2 = np.array([[10, 20], [10, 20]]) # In[90]: B2 # In[89]: A * B2 # ### 1.5.6 要素へのアクセス # In[98]: X = np.array([[51, 55], [14, 19], [0, 4]]) # In[92]: X # In[93]: X[0] # In[95]: for row in X: print(row) # In[99]: X = X.flatten() # In[100]: X # In[101]: X[np.array([0, 2, 4])] # In[105]: X[0:4:2] # In[103]: X > 15 # In[104]: X[X>15] # ## 1.6 Matplotlib # ### 1.6.1 単純なグラフの描画 # In[106]: get_ipython().run_line_magic('matplotlib', 'inline') import matplotlib.pyplot as plt # In[107]: x = np.arange(0, 6, 0.1) y = np.sin(x) # In[108]: plt.plot(x, y) # plt.show() # ※↑テキストには `%matplotlib inline` の行がなく、最後の `plt.show()` がコメントアウトされていない。 # これは Jupyter の機能で、`%matplotlib inline` を記述しておくとグラフがセル単位でまとまり、`plt.show()` を書かなくてもそのセルで定義したグラフがそのセルの出力として描画される。便利。 # ### 1.6.2 pyplot の機能 # In[109]: y1 = np.sin(x) y2 = np.cos(x) # In[111]: plt.plot(x, y1, label="sin") plt.plot(x, y2, linestyle="--", label="cos") plt.xlabel("x") plt.ylabel("y") plt.title('sin & cos') plt.legend() # ※↑一連の `plt.xxx()` を1つのセルにまとめて記述している点に注意。 # これを複数のセルに分割してしまうと、それぞれのセルごとにグラフを描画してしまう。 # ### 1.6.3 画像の表示 # In[112]: from matplotlib.image import imread # In[113]: img = imread('lena.png') # In[114]: plt.imshow(img) # ※「jpeg が表示できない(`imread()`でエラーになる)」という意見が出ました。 # 調査した結果、標準では jpeg は読み込めず、別ライブラリ [Pillow](https://pillow.readthedocs.io/en/4.1.x/) が必要なようです。 # 用意した Dockerイメージ には含めていないのでそれを利用されている方は表示できません。実案件ではその環境も用意する必要があります。 # この勉強会では特に重要ではない(おそらくこの先 `.jpg` ファイルを読み込むことはない)ので、このまま進めます。 # ## 1.99 補足 # In[115]: A # In[116]: B2 # In[117]: A * B2 # ※↑これがテキストに出てきた積(要素ごとの積、elementwise multiplication)。 # ↓(通常の)行列積は、こう書く。 # In[118]: A.dot(B2) # ※ベクトルで `.dot()` すると、内積(所謂「ドット積」)になる。 # In[120]: x = np.array([1, 2]) # In[121]: y = np.array([3, 4]) # In[122]: x.dot(y) # ※↓こんな計算も出来る(ドット積のブロードキャストになっている) # In[123]: A.dot(x) # In[ ]: