Python 3 基礎からDeep Learning まで

Python 3の勉強を始めました! 気になる箇所,つまづいて復習しなおしたところなどまとめていきます! 質問・ご意見等,大歓迎です!

Python 3: print と return について(超基礎)

print()returnについて

関数の定義でprint()returnどちらをつかうべきか?

  • print()・・・表示するだけ
  • return・・・戻り値を返す
>>> def print_hello():
...     print("hello")
...
>>> print_hello()
hello
>>> def return_hello():
... return "hello"
...
>>> return_hello()
'hello'
>>> print(return_hello())
hello

ジェネレータ関数で理解を深める

  • ジェネレータ関数では,returnの代わりにyieldを用いる
  • ジェネレータ関数を定義して,イテレータのように値を次々を取り出せるオブジェクトを作ることができる

Questionrange(10)から奇数を返すoddsというジェネレータ関数を定義し,返された3番目の値を見つけて表示せよ.


  • odds()を実行するとジェネレータ・オブジェクトであることが分かる.
>>> def odds():
...     for num in range(1, 10, 2):
...         yield num
...
>>> for count, number in enumerate(odds(), 1):
...     if count == 3:
...         print(number)
...         break
...
5

  • odds2()では,returnによってfor文で現れる最初の値が返される.
  • odds2()int型であることが分かる
>>> def odds2():
...     for num in range(1, 10, 2):
...         return num
...
>>> odds2()
1
>>> odds2()
1
>>> for count, number in enumerate(odds2(), 1):
...     if count == 3:
...         print(number)
...         break
...
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'int' object is not iterable

  • odds3()ではprint()によって1から10までの奇数が表示される
  • odds3()NoneType型で,これはイテラブルでないのでエラーを吐く
>>> def odds3():
...     for num in range(1, 10, 2):
...         print(num)
...
>>> odds3()
1
3
5
7
9
>>> for count, number in enumerate(odds3(), 1):
...     if count == 3:
...         print(number)
...         break
...
1
3
5
7
9
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'NoneType' object is not iterable

NoneTypeとは?

>>> type(None)
<class 'NoneType'>

NoneTypeについてはまとめ中...

Python:文字列について(超基礎)

文字列について

  • 文字の値は,文字列またはストリングという
  • ダブルクォートまたはシングルクォートで囲って作る
    • 例:"文字列" または '文字列'
  • 文字列の中に改行やタブを埋め込みたいときは,エスケープシークエンスを用いる
    • 改行:\n
    • 水平タブ:\t
    • キャリッジリターン(一番前に移動):\r
    • ダブルクォート:\"
    • シングルクォート:\'
    • バックスラッシュ:\\
  • 複数行の文字列はクォートを3個続けて囲めば良い
    • """文字列""" または '''文字列'''

型の変換について

  • "大きさ12.3m" のように文字列と数値を連結したいとき,+演算子ではエラーが起きる
  • str()を用いて数値を文字列に型変換すれば良い
>>> num = 12.3
>>> a = "大きさ" + str(num) + "m"
>>> a
'大きさ12.3m'
  • 同様に,整数値への型変換はint()浮動小数点への型変換はfloat(),論理値への型変換はbool()で行える

format()を用いて文字列に値を埋め込む

  • Python 3.6からは,f"{値}"またはF"{値}"で,値を文字列に埋め込めるようになった
  • fを付けた文字列には変数を埋め込める
>>> a = "斎藤"
>>> b = 25
>>> c = 165.0
>>> ans = f"{a}さん,年齢{b}歳,身長{c}cmです."
>>> print(ans) 
斎藤さん,年齢25歳,身長165.0cmです.

Code Penとは?(さくっと)

CodePenとは

  • Webブラウザ上でコーディングできる
  • プレビューがすぐ確認できる
  • ソースコードが共有できる
  • 他人のソースも編集できる
  • ソースをWebサイトに埋め込むのが簡単にできる
  • 対応言語:HTML, CSS, JavaScript など

Python 3:3次元グラフの書き方(matplotlib, pyplot, mplot3d, MPL)

3次元のグラフの書き方

ニューラルネットワークの学習で現れる,偏微分(勾配)の理解のため3次元グラフを描いてみる.(参考:数値微分
Pythonで,NumPyとmatplotlibを使って3次元グラフを描く

準備

  • 3次元なのでmpl_toolkits.mplot3dなどをインポート
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np
  • 引数の2乗和を計算する関数を例として考える
def func1(x, y):
    return x**2 + y**2
  • 描写データの作成
    • 3次元で描写するには2次元メッシュが必要
    • 2次元配列をarangeを用いて作る
    • x, y をそれぞれ1次元領域で分割する
x = np.arange(-3.0, 3.0, 0.1)
y = np.arange(-3.0, 3.0, 0.1)
  • 2次元メッシュはmeshgridでつくる
    • Xの行にxの行列を,Yは列にyの配列を入れたものになっている
X, Y = np.meshgrid(x, y)
Z = func1(X, Y)
  • グラフの作成
    • figureで2次元の図を生成する
    • その後,Axes3D関数で3次元にする
fig = plt.figure()
ax = Axes3D(fig)
  • 軸ラベルの設定
ax.set_xlabel("x")
ax.set_ylabel("y")
ax.set_zlabel("f(x, y)")

-グラフ描写

ax.plot_wireframe(X, Y, Z)
plt.show()

以上をまとめて実装すれば,以下のような3次元のグラフが描画されます.


ex1.png


plotのプロパティとして,color(線の色),linestyle(線の種類),マーカーの種類などが変更できる.

もっと簡単に描けるコードなどありましたらご教授ください.
詳細は後ほど追加する予定です.

Python 3:クラスとインスタンス(オブジェクト) (超基礎)

クラスとは?

  • クラス:オブジェクトを作るための設計図
  • クラスではオブジェクトの「属性」と「実行できること」を定義する
    • 属性は変数で,実行できることは関数(メソッド)で定義する
  • 以下,クラス定義の構文
class クラス名:
    ステートメント

銃(Gun)を例として,Gunクラスのオブジェクト仕様を定義してみる

  • Gunクラスのオブジェクトには,次に示す変数と関数を仮定する
    • 変数
      • color:銃の色(初期値"black")
      • number:装弾数(初期値 0)
    • 関数
      • shoot:引数で指定した数だけ弾を打つ

  • 初期化メソッド
    • クラス定義にはインスタンス(クラスから作ったオブジェクト)が作られたときに実行される初期化メソッドを書くことができる
def __init__(self, 引数1, 引数2, ...):
    初期化の処理
  • 注意
    • 第1引数であるselfには初期値が設定されていないので省略不可
    • selfにはインスタンス自身の参照が入っている

  • Gunクラスをつくる
class Gun: #Gunクラス
    def __int__(self, color="black") #初期化メソッド
        self.color = color #引数で受け取った値を代入 
        self.number = 0 #装弾数 0 から始める
  • この後,from ex2-3 import Gunとやって,gun1 = Gun()とすれば良い
要望有ればもう少し詳しくまとめます.

Python 3:sys.pathとos.pathについて(機械学習,手書き数字認識)

sys.pathos.pathとは?

機械学習の手書き数字認識という問題で,データセットを呼び出すときに遭遇.
  • sys.pathの中身はリスト
  • os.pathはモジュールで,中身はパス名を操作する関数などが入っている

sys.pathos.pathで何ができるのか?

  • sys.path.argv()Pythonスクリプトに渡されたコマンドライン引数のリスト

  • sys.path.append()sys.pathに引数内のパスを加える操作を行う

    • sys.path.append(os.pardir)os.pardirは親ディレクトリを表す文字列定数
    • これは,ディレクトリのファイルをインポートするための設定
  • os.path.join():引数の複数の値をつなげてパスにする関数

まとめ:

  1. システムパラメータや関数をいじるときにsysosモジュールを用いる
  2. データセットの呼び出しという今回の目的に限れば,sys.path.append(os.pardir)の意味するところは,「システムに親ディレクトリまでのパスを加える」といったところか.

Python:モジュールについて(超基礎)

モジュールとは?

  1. Pythonインタプリタを終了させる
  2. 再び起動すると,これまでの定義は失われる

面倒だ!

モジュールのインポート(モジュールを使う)方法

  1. ある関数を定義したモジュールをmodule.pyとする
  2. コードでは,import modeleと書いてmoduleモジュールを呼び出す(拡張子の.pyはいらない)
  3. あとは,関数を使うだけ!

まとめ:

from モジュール名 import クラス名(関数名も可) as 別名
  • as 別名 として「別名」で呼び出せる
  • よく使う関数はファイルに保存し,それを呼び出して使う
  • モジュールはPythonの定義や文が入ったファイル
  • ファイル名はモジュール名に接尾語.pyが付いたもの
  • import モジュール名でモジュールが呼び出せる

とりあえず,ここまでが導入です.