金子邦彦研究室プログラミングPython のまとめ(Google Colaboratory を含む)

Python のまとめ

Python でできること,Python での書き方をすばやく確認できるページ.

目次

  1. Google Colaboratory でノートブックを開く

    Google Colaboratory はオンラインの Python 開発環境

  2. Windows での Python のインストール
  3. Jupyter Qt Console, JupyterLab
  4. Python の隔離された環境 venv
  5. オブジェクトの生成と削除, 同値, 同一性
  6. 単純値のデータ型
  7. オブジェクトのタイプ(クラス名)の取得
  8. 文字列の演算子
  9. pandas データフレーム
  10. numpy 全般
  11. 1次元の配列
  12. 2次元の配列
  13. 2次元の配列の種々の処理
  14. numpy の npz 形式(numpy.ndarray)ファイルの書き出しと読み込み
  15. 2次元配列データのCSV ファイル読み書き
  16. メッシュグリッド
  17. 配列の次元を増やす
  18. リスト
  19. Pythonのモジュール
  20. Pythonのライブラリ
  21. Matplotlib を用いたプロット
  22. TensorFlow
  23. Keras
  24. ニューラルネットワークによる画像分類
  25. 制御構造(条件分岐,繰り返し)
  26. 式と変数
  27. 関数定義,関数オブジェクト
  28. 式の抽象化と関数
  29. 式の評価のタイミング
  30. クラス定義,オブジェクト生成,属性アクセス
  31. メソッド
  32. スーパークラスからの継承

外部ページへのリンク(Python 関連)

サイト内の関連ページ

Google Colaboratory でノートブックを開く

Google Colaboratory はオンラインの Python 開発環境. 使用するには Google アカウントが必要

  1. Google Colaboratory のWebページを開く

    https://colab.research.google.com

    [image]
  2. ファイル」で、「ノートブックを新規作成」を選ぶ

    [image]
  3. Google アカウントでのログインが求められたときはログインする

    [image]
  4. コードセルの中に Python プログラムを書き、「再生ボタン」をクリック

    [image]
  5. コードセルを追加したいときは、「挿入」で、「コードセル」をクリック

    [image]

Google Colaboratory で GPU の確認

!nvidia-smi --query-gpu=gpu_name,driver_version,memory.total --format=csv

[image]

Google Colaboratory を使用中であるかを判別する Python プログラム

try:
    from google.colab import drive
    USE_COLAB = True
except:
    USE_COLAB = False

Google Colaboratory での実行結果

[image]

Windowsコマンドプロンプトでの実行結果

[image]

Windows での Python のインストール

Windows では,複数のバージョンの Python を同時にインストールすることは簡単である.そのときは,環境変数 Path の設定を常に意識すること.Python ランチャーである「py」コマンドも利用すること.

古いバージョンの Python のアンインストール

すでに,Python がインストール済みのとき.

ここで示すインストール手順とは異なる設定ですでに Python をインストールしていた場合は,それをそのまま使うよりも, アンインストールしておいたほうがトラブルが少ない可能性がある.

  1. Python をインストール済みであるかを確認.
  2. インストール済みのときは,Pythonをすべてアンインストールしてから,ここから先の操作を開始した方がトラブルが少ない.
  3. Python 関係のファイルの削除

    Windows では,コマンドプロン プトを管理者として実行し, 次のコマンドを実行する.

    この操作は,必ずPython をすべてアンインストールした後に行うこと.

    [image]

    rmdir /s /q %APPDATA%\Python
    cd "C:\Program Files"
    for /F %i in ('dir /ad /b /w Python3*') do rmdir /s /q %i 
    

Python 3.9 のインストール

Python のインストールでの注意点

Python 3.9 のインストール(Windows 上)のページ: https://www.kkaneko.jp/tools/win/python.html

YouTube 動画: https://www.youtube.com/watch?v=2MlVmx-yLM8

インストール手順

Windows での Python 3.10 のインストール(あとのトラブルが起きにくいような手順を定めている)

  1. TensorFlow のインストール予定がある場合には, 次のページで,必要な Python のバージョンを確認

    URL: https://pypi.org/project/tensorflow-gpu/#files

  2. Python の URL を開く

    URL: https://www.python.org

  3. Windows 版の Python 3.10 をダウンロード

    ページの上の方にある「Downloads」をクリック. 「Downloads」の下にメニューが出るので,その中の「Windows」をクリック

    [image]
  4. Stable Releases」から,Python のバージョンを選ぶ

    ここでは,Python 3.10 系列の最新版を探して,選ぶ.

    [image]

    以下,Python 3.10.9 を選んだとして説明を続ける.他のバージョンでも以下の手順はほぼ同じである.

    TensorFlow を使う予定がある場合は,https://pypi.org/project/tensorflow-gpu/#filesで,必要な Python のバージョンを確認しておく. 2022/9 時点では,TensorFlow バージョン 2.10 が動くのは,Python 3.10 または Python 3.9 または Python 3.8 または Python 3.7 (https://pypi.org/project/tensorflow/2.10/#files)

  5. ファイルの種類を選ぶ.

    Windows の 64ビット版のインストーラをダウンロードしたいので、「Windows Installer (64-bit)」を選ぶ

    [image]
  6. ダウンロードが始まる

    [image]
  7. インストール時の設定
    1. いまダウンロードした .exe ファイルを右クリック, 右クリックメニューで「管理者として実行」を選ぶ.

      [image]
    2. Python ランチャーをインストールするために,「Install launcher for all users (recommended)」をチェック.

      [image]

      ※ すでに Python ランチャーをインストール済みのときは, 「Install launcher for all users (recommended)」がチェックできないようになっている場合がある.そのときは,チェックせずに進む.

      [image]
    3. Add Python.exe to PATH」をチェック.

      [image]
    4. Customize installation」をクリック.

      [image]
    5. オプションの機能 (Optional Features)は,既定(デフォルト)のままでよい. 「Next」をクリック

      [image]
    6. Install Python 3.10 for all users」を選ぶ.

      Install Python 3.10 for all users」を選ぶ理由.

      ユーザ名が日本語のときのトラブルを防ぐため.

      [image]
    7. そして,Python のインストールディレクトリは,「C:\Program Files\Python310」のように自動設定されることを確認.

      [image]
    8. Install」をクリック

      [image]
    9. インストールが始まる

      [image]
    10. Disable path length limit」が表示される場合がある.クリックして、パス長の制限を解除する

      表示されない場合は問題ない.そのまま続行.

    11. インストールが終了したら,「Close」をクリック

      [image]
  8. インストールのあと,Windows のスタートメニューに「Python 3.10」が増えていることを確認.
  9. システムの環境変数 Path の確認のため,新しくコマンドプロンプトを開き,次のコマンドを実行する.

    pypipパスが通っていることの確認である.

    where py
    where pip
    

    where py では「C:\Windows\py.exe」 が表示され, where pip では「C:\Program Files\Python310\Scripts\pip.exe」 が表示されることを確認. (「310」のところは使用する Python のバージョンに読み替えること).

    [image]

    表示されないときは, システムの環境変数Pathに,C:\Program Files\Python310C:\Program Files\Python310\Scripts が追加済みであることを確認(「310」のところは使用する Python のバージョンに読み替えること).無ければ追加し,再度コマンドプロンプトを開いて,再度「where py」,「where pip」を実行して確認.

    それでもうまく行かない場合は,いろいろ原因が考えられる.対処としては,Python のアンインストールを行う.過去,アンインストールがうまく行かなかった可能性を疑う(Python の Scripts の中のファイルで,アンインストール操作により削除されるべきファイルが残っている可能性があるなど)

(3) pip と setuptools の更新

  1. Windows で,コマンドプロンプト管理者として実行

    Windowspip を実行するときは,コマンドプロンプト管理者として開き,それを使って pip を実行することにする.

    コマンドプロンプトを管理者として実行: 別ページ »で説明

  2. 次のコマンドを実行する.
    python -m pip install -U pip setuptools
    

    [image]

Python に関しての情報取得

Python にトラブルがあった時に役に立つように,情報取得の手順をまとめている.

  1. Windowsのシステム環境変数Path

    インストール時に,「Add Python ... to PATH」をチェックしたので、 Python についての設定が自動で行われる.

    [image]
  2. python のバージョンの確認
    python --version 
    

    [image]
  3. Python のビルドに用いられたコンパイラのバージョン番号の確認
    python
    

    下の実行例では、バージョン番号として「1934」が表示されている

    [image]
  4. 次のPythonプログラムを実行し,バージョン番号を確認

    下の実行例では、バージョン番号として「14.3」が表示されている

    from distutils.msvc9compiler import *
    get_build_version()
    

    [image]
  5. exit() で終了

    [image]
  6. pip の動作確認

    Python のパッケージも同時にインストールされることが分かる.

    ※ エラーメッセージが出ないことを確認.

    pip list
    

    [image]

Jupyter Qt Console, Jupyter ノートブック (Jupyter Notebook), JupyterLab

JupyterLab, Jupyter ノートブック (Jupyter Notebook), Jupyter Qt Console は Python プログラム作成に関する種々の機能を持ったソフトウェア

Python プログラムを動かして,結果をビジュアルに見たいときは, 開発環境や Python コンソール(Jupyter Qt Console, SpyderPyCharmPyScripter など)が便利.

Windows での Jupyter Qt Console, Jupyter ノートブック (Jupyter Notebook), JupyterLab の起動

複数の Python バージョンを共存しているときは, Python ランチャーを使う. 次のようにバージョン指定する.

Windows での Jupyter Qt Console, Jupyter ノートブック (Jupyter Notebook), JupyterLab のインストール

Jupyter Qt Console, Jupyter ノートブック (Jupyter Notebook), JupyterLab のインストールは, Windows でコマンドプロンプトを管理者として開き 次のコマンドを実行する.

python -m pip install -U pip setuptools jupyterlab jupyter jupyter-console jupytext PyQt5 nteract_on_jupyter spyder

Ubuntu での Jupyter Qt Console, JupyterLab の起動

複数の Python バージョンを共存しているときは, pyenvを使う. 次のようにバージョン指定する.

JupyterLab の起動は,「pyenv shell <バージョン>; jupyter lab」. Jupyter Qt Console の起動は,「pyenv shell <バージョン>; jupyter qtconsole」.

Python の隔離された環境 venv

Python には,さまざまなパッケージをインストールすることができる. venv の利用により,Python の仮想環境を作成し,パッケージが違う複数の Python 環境を共存させることができる.

venv は Python 3 の標準機能になった.

詳しい説明は,venv の公式の説明ページ: https://docs.python.org/ja/3/library/venv.html

Python の仮想環境を扱う(venv を使用)(Windows の場合)

venv を用いて,新しいPython の仮想環境の生成 Python の隔離された環境の新規作成,有効化,無効化を行う.

  1. 前もって Python をインストールしておく.使用している Python のバージョンの確認は,次のコマンドで行うことができる.
    python --version
    
  2. Python の仮想環境の作成

    ここでは,venv のためのディレクトリ名「%HOMEPATH%\.venv」を指定して,新しいPython の仮想環境を生成する.

    venv のためのディレクトリ名は何でもよいが,venv で使うことが分かるような分かりやすい名前がよい.記号や,日本語などの全角文字を含めないのがよい.

    ※ 「python -m venv」は,venv モジュールの実行

    python -m venv %HOMEPATH%\.venv
    dir /w %HOMEPATH%\.venv
    

    [image]
  3. Python の隔離された環境の有効化
    %HOMEPATH%\.venv\Scripts\activate.bat
    

    [image]

    [image]
  4. パッケージを確認してみる

    いま,venv を使用中かどうか,プロンプトの「(venv)」で分かる.

    python -m pip list
    

    [image]
  5. 現在使用している Python の隔離された環境の使用中止(無効化)
    deactivate
    

    [image]

複数のバージョンの Python をインストールしているとき(Windows の場合)

複数のバージョンの Python をインストールしているときは, 「python」の代わりに, Python ランチャー の「py」を使うのが便利である.

  1. Python ランチャーで,インストール済みの Python のバージョンを確認
    py -0
    

    「-3.9-64」,「-3.8-32」,「-3.8-64」が表示されたする. この場合,これら 3つのバージョンがインストール済みであり, 「py -3.9-64」や「py -3.8-32」や「py -3.8-64」で python を使うことができる.

    新しい別バージョンの Python を使うときは,Python のインストール: 別ページ »で説明を行う. Windows でのインストール手順は,別ページ »で説明 Windows で,ふつうにインストールを行うと,py で扱えるように自動設定される.

    Windows では,Python 3 の複数バージョンの同時インストールは,特別に設定を行うことなくできる.

  2. 新しい Python の隔離された環境の生成

    ここでは,venv のためのディレクトリ名「%HOMEPATH%\.venv」を指定して,新しいPython の仮想環境を生成する.

    venv のためのディレクトリ名は何でもよいが,venv で使うことが分かるような分かりやすい名前がよい.記号や,日本語などの全角文字を含めないのがよい.

    -3.9 は,使用したい Python のバージョンの指定である.

    ※ 「python -m venv」は,venv モジュールの実行

    py -3.9 -m venv %HOMEPATH%\.venv
    dir /w %HOMEPATH%\.venv
    
  3. Python の隔離された環境の有効化
    %HOMEPATH%\.venv\Scripts\activate.bat
    

  4. Python ランチャーの実行において,先ほど指定した Python のバージョンのものが実行されるように設定されている.そのことを確認.
    py -0 
    py --version
    py
    
  5. python コマンドでも,先ほど指定した Python のバージョンのものが実行されるように設定されている.そのことを確認.
    python --version
    
  6. パッケージを確認してみる
    python -m pip list
    
  7. 現在使用している Python の隔離された環境の使用中止(無効化)
    deactivate
    

Python の仮想環境を扱う(venv を使用)(Ubuntu の場合)

venv を用いて,新しいPython の仮想環境の生成 Python の隔離された環境の新規作成,有効化,無効化を行う.

  1. python3-venv のインストール
    sudo apt -y update
    sudo apt -y install python3-venv
    
  2. 使用している システム Python のバージョンの確認は,次のコマンドで行うことができる.
    python3 --version
    

    [image]
  3. Python の仮想環境の作成

    ここでは,venv のためのディレクトリ名「~/.venv」を指定して,新しいPython の仮想環境を生成する.

    venv のためのディレクトリ名は何でもよいが,venv で使うことが分かるような分かりやすい名前がよい.記号や,日本語などの全角文字を含めないのがよい.

    システム Python違うバージョンの Python を使いたいときは, pyenv の利用が便利である.pyenv の詳細は,別ページ »で説明

    ※ 「python3 -m venv」は,システム Python を用いての venv モジュールの実行

    python3 -m venv ~/.venv
    ls -la .venv 
    

    [image]
  4. Python の隔離された環境の有効化
    source ~/.venv/bin/activate
    

    [image]
  5. パッケージを確認してみる

    いま,venv を使用中かどうか,プロンプトの「(venv)」で分かる.

    python -m pip list
    

    [image]
  6. 現在使用している Python の隔離された環境の使用中止(無効化)
    deactivate
    

    [image]

オブジェクトの生成と削除, 同値, 同一性

プログラミングでのオブジェクトは,コンピュータでの操作や処理の対象となるもののこと.

キーワード: =, del, ==, is

単純値のデータ型

オブジェクトのタイプ

print( type(100) )
print( type(1.23) )
print( type(True) )
print( type(False) )
print( type("Hello") )
print( type([1, 2, 3]) )
dic = {}
dic.update( {"kaneko": 30} )
print( type(dic) )
Point3d = collections.namedtuple('Point3d', 'x y z')
p = Point3d(10, 20, 30)
print( type(p) )
import numpy as np
print( type(np.zeros(10)) )

[image]

制御構造(条件分岐,繰り返し)

キーワード: if, elif, else, while, break, for

条件分岐

繰り返し

  • 月の日数

    月の日数についてのデータを作る.うるう年のことは考えないことにする

    import numpy as np
    days = np.array([0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31])
    print( days[7] )
    print( days[9] )
    

    [image]
  • 物体の落下

    for による繰り返し

    import numpy as np
    x = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
    for t in x:
        print( (9.8 / 2) * t * t )
    

    [image]
  • 10倍

    for による繰り返し

    import numpy as np
    x = np.array([8, 6, 4, 2, 3])
    y = np.array([0, 0, 0, 0, 0])
    for i in range(0,5):
        y[i] = x[i] * 10
    
    print(x)
    print(y)
    

    [image]

    「*」の表示を 18 回繰り返す(* を 18 個並べて表示)

    for による繰り返し

    import sys
    for i in range(18):
        sys.stdout.write("*")
    

    [image]

    文字列の演算子

    キーワード: +, in, %, split, join, replace, strip, match, sprintf

    pandas データフレーム

    Pandas を用いたデータの扱い (CVSファイル読み込み、散布図、要約統計量、ヒストグラム)を示す.

    説明のために,次のようなデータ(CSV ファイル)を使う.ファイル名は enquete.csv

    [image]

    このデータ(CSV ファイル)のダウンロードは, Windows でコマンドプロンプトを管理者として開き 次のコマンドを実行する.

    cd C:\
    curl -O https://www.kkaneko.jp/sample/csv/enquete.csv
    

    上のコマンドが実行できないときは,次のリンクからダウンロードする.ダウンロードしたファイルは、C:\ の直下に置く https://www.kkaneko.jp/sample/csv/enquete.csv

    CSV ファイルの読み込み、確認

    ※ Python でグラフや図を表示したい. Windows では,スタートメニューの「IDLE (Python ...)」,spyder3コマンド,PyCharmが便利である.

    1. アンケートデータの読み込み
      import pandas as pd
      import seaborn as sns
      
      x = pd.read_csv('C:/enquete.csv', encoding='SHIFT-JIS')
      
      

      [image]

      先頭行にデータ本体がある(先頭行が属性名でない)ときは、「pd.read_csv('hoge.csv', )」のようにする

    2. 読み込んだデータの表示
      print(x)

      [image]
    3. 読み込んだデータのうち、1列目と 2列目の表示

      オブジェクト x には 0列目と 1列目と 2列目がある.

      print(x.iloc[:,1]) 
      print(x.iloc[:,2]) 
      

      [image]
    4. 読み込んだデータについて、1列目と 2列目の散布図

      plt.style.use('ggplot')」はグラフの書式の設定.「ro」は「赤い丸」という意味.

      %matplotlib inline
      import matplotlib.pyplot as plt
      import warnings
      warnings.filterwarnings('ignore')   # Suppress Matplotlib warnings
      plt.style.use('ggplot')
      plt.plot(x.iloc[:,1], x.iloc[:,2], 'ro')
      plt.show()
      

      [image]
    5. 各列について、基本的な情報の表示
      • head: 先頭部分の表示
      • shape: サイズ
      • ndim: 次元数
      • columns: 属性名
      • info(): 各属性のデータ型
      print(x.head())
      print(x.info())
      print(x.shape)
      print(x.ndim)
      print(x.columns)
      

      [image]
    6. CSV ファイルに書き出し
      x.to_csv('hoge.csv', header=True, index=False, encoding='SHIFT-JIS')
      

    各属性の要約統計量(総数、平均、標準偏差、最小、四分位点、中央値、最大)

    print(x.describe())
    

    [image]

    JSONファイルの書き出しと読み込み

    import numpy as np
    pd.to_json('hoge.json')
    a = pd.read_json('hoge.json')
    

    pandas.DataFrame のコンストラクタ

  • データフレーム
    import pandas as pd
    pd.DataFrame( {'x' : [1, 2, 3], 'y' : [4, 5, 6]} )
    
    ヒストグラムの表示
    plt.hist(x.iloc[:,1])
    plt.show()
    
    plt.hist(x.iloc[:,2])
    plt.show()
    

    [image]

    [image]

    2次元ヒストグラム

    plt.hist2d(x.iloc[:,1], x.iloc[:,2])
    plt.show()
    

    [image]

    numpy 全般

    次元数

    numpy の1次元の配列の次元数1.(ndimで得る)

    1次元の配列の(<要素数>,)のように表示される(shapeで得る)

    import numpy as np
    x = np.zeros(10)
    print( x.ndim )
    print( x.shape )
    

    [image]

    numpy の2次元の配列の次元数2.(ndimで得る)

    2次元の配列の((<要素数>,<要素数>))のように表示される(shapeで得る)

    import numpy as np
    x = np.zeros((2, 3))
    print( x.ndim )
    print( x.shape )
    

    [image]

    データ型と,要素のデータ型

    1次元の配列のデータ型は numpy.darray.(typeで得る)

    配列の要素のデータ型は dtypes を使って表示… 「float64」は浮動小数点数

    import numpy as np
    x = np.zeros(10)
    print( type( x ) )
    print( x.dtype )
    

    [image]

    2次元の配列のデータ型は numpy.darray.(typeで得る)

    配列の要素のデータ型は dtypes を使って表示… 「float64」は浮動小数点数

    import numpy as np
    x = np.zeros((2, 3))
    print( type( x ) )
    print( x.dtype )
    

    [image]

    1次元の配列

    配列は,データの並びで,それぞれのデータに,0 から始まる番号(添字)が付いている.

    1次元の配列の生成

    合計

    8, 6, 4, 3, 2 というデータについて,合計を求める

    import numpy as np
    x = np.array([8, 6, 4, 2, 3])
    print(sum(x))
    

    [image]

    2次元の配列

    import numpy as np
    x = np.zeros((2, 3))
    print(x)
    print(type(x))
    print(x.shape)
    

    表示の「0.」は「0」のこと

    [image]
    import numpy as np
    x = np.ones((2, 3))
    print(x)
    print(type(x))
    print(x.shape)
    

    表示の「1.」は「1」のこと

    [image]
    import numpy as np
    x = np.random.randn(2,3)
    print(x)
    print(type(x))
    print(x.shape)
    

    [image]
  • 乱数(正規分布)
    import numpy as np
    x = np.random.randn(2,3)
    print(x)
    

    [image]

    2次元の配列の種々の処理

    行列の積

    時間計測も行う.

    import numpy as np
    import time
    
    x = np.random.randn(5000, 5000)
    y = np.random.randn(5000, 5000)
    
    s = time.time()
    z = np.dot(x, y)
    print("%1.3f [sec.]" % float(time.time() - s))
    

    [image]

    CuPy を用いて行列の積を求める

    時間計測も行う.

    行列の積,主成分分析,SVD,k-means

    import time
    import numpy
    import numpy.linalg
    import sklearn.decomposition
    import sklearn.cluster
    X = numpy.random.rand(2000, 2000)
    Y = numpy.random.rand(2000, 2000)
    # 行列の積
    a = time.time(); Z = numpy.dot(X, Y); print(time.time() - a)
    # 主成分分析
    pca = sklearn.decomposition.PCA(n_components = 2)
    a = time.time(); pca.fit(X); X_pca = pca.transform(X); print(time.time() - a)
    # SVD
    a = time.time(); U, S, V = numpy.linalg.svd(X); print(time.time() - a)
    # k-means
    a = time.time(); 
    kmeans_model = sklearn.cluster.KMeans(n_clusters=10, random_state=10).fit(X)
    labels = kmeans_model.labels_
    print(time.time() - a)
    

    numpy の npz 形式(numpy.ndarray)ファイルの書き出しと読み込み

    import numpy as np
    np.savez('hoge.npz',a = np.array([1, 2, 3]), b = np.array([1, 2, 3]))
    m = np.load('hoge.npz')
    print( m['a'] )
    print( m['b'] )
    

    2次元配列データのCSV ファイル読み書き

    CSV ファイル書き出し.pandas の機能で行う.次のプログラム実行により, ファイル XX.csv とYY.csv ができる.

    import numpy as np
    import pandas as pd
    X, Y = np.meshgrid( np.array([2, 3, 4]), np.array([10, 20]) )
    XX = pd.DataFrame(X)
    print(XX)
    XX.to_csv("XX.csv", header=False, index=False)
    YY = pd.DataFrame(Y)
    print(YY)
    YY.to_csv("YY.csv", header=False, index=False)
    

    [image]

    CSV ファイル読み込み.pandas の機能で行う. これは,いま作成したファイル XX.csv を読み込むもの.

    pd.read_csv("XX.csv", header=None)
    

    [image]

    今度は,ファイル YY.csv を読み込む.

    pd.read_csv("YY.csv", header=None)
    

    [image]

    メッシュグリッド

    3次元のグラフを作るとき.あるいは,計算を繰り返すときに便利

    import numpy as np
    X, Y = np.meshgrid( np.array([2, 3, 4]), np.array([10, 20]) )
    print(X)
    print(type(X))
    print(X.shape)
    print(Y)
    print(type(Y))
    print(Y.shape)
    

    [image]

    配列の次元を増やす

    1次元を2次元に.

    次のプログラムは,1次元の配列 x を,2次元の配列 A, B に変換する.

    import numpy as np
    x = np.array([3, 1, 2, 5, 4])
    A = x[:, np.newaxis]
    B = x[np.newaxis, :]
    print(A)
    print(type(A))
    print(A.shape)
    print(B)
    print(type(B))
    print(B.shape)
    

    [image]

    リスト

    a = [1, 2, 3, 4]
    print(a)
    type(a)
    

    [image]

    Python のリストの添字は 0 から開始する

    a = [10, 20, 30]
    print(a[1])
    a[2] = 200
    print(a)
    

    [image]

    Python のモジュール

    Python のモジュールは,1つ以上の関数を集めて,1つのファイルに集めたもの.下の Python モジュールには関数 tax が入っている. p> Python のモジュールは,単体でも実行できるように作ることができる.これは,モジュールのテストを行いたいときに便利(下の例では,「if __name__ == "__main__"」から始まる部分が,単体でも実行できるようにするためのもの)

    def tax(x):
        return x * 1.08
    
    if __name__ == "__main__":
        print(tax(100))
    

    [image]

    上に書いたモジュールを,他のプログラムでインポートして使いたいときは, まず,モジュールを,「hoge.py」のようなファイル名で保存すする.そして,プログラムを 次のように書く.

    import hoge
    print(hoge.tax(10))
    

    Python のライブラリ

    ここでの例 現在の日時, 最大公約数, 方程式を解く, 平方根, 円周率, 三角関数, など

    現在の日時

    オペレーティングシステム(コンピュータ)のタイマーを利用 いまの日時が表示されることを確認.

    import datetime
    now = datetime.datetime.now()
    print(now)
    

    [image]

    最大公約数

    2418 の最大公約数を求めたい.結果 6 を確認.

    import math
    print( math.gcd(24, 18) )
    

    [image]

    方程式を解く

    4x + 1 = 0 を解きたい

    from scipy import optimize
    def foo(x):
        return 4 * x + 1
    print( optimize.fsolve(foo, 10) )
    

    [image]

    平方根

    面積が 7 の正方形の一辺の長さは?

    次のプログラムを実行.結果 2.6457513110645907 を確認(結果は近似値)

    import math
    print( math.sqrt(7) )
    

    [image]

    円の面積

    半径 3 の円の面積は? 円周率は, Pythonのモジュールの math.pi を使用 結果は,近似値で求まる.

    import math
    print( 3 * 3 * math.pi )
    

    [image]

    三角形の面積

    三角形の2辺の長さが,46で,その間の角度が60度のとき.

    import math
    print( (1/2) * 4 * 6 * math.sin(60 * math.pi / 180) )
    

    [image]

    IPython.display を用いた画像表示

    画像ファイルを読み込んで表示

    from PIL import Image
    Image.open("126.png").show()
    

    [image]

    Matplotlib を用いたプロット

    matplotlib は,オープンソースの Python のプロットライブラリ.

    散布図

    3次元散布図

    %matplotlib inline
    import matplotlib.pyplot as plt
    import warnings
    warnings.filterwarnings('ignore')   # Suppress Matplotlib warnings
    import numpy as np
    from mpl_toolkits.mplot3d import axes3d
    plt.style.use('ggplot')
    fig = plt.figure()
    ax = fig.add_subplot(111, projection = '3d')
    x = [1, 2, 3, 4, 5]
    y = [2, 4, 1, 3, 5]
    z = [1, 1, 2, 2, 3]
    ax.scatter(x, y, z, c='b')
    

    [image]

    OpenCV 画像の表示

    matplotlib を用いて,OpenCV のカラー画像を表示する例は次の通り.

    import cv2
    import matplotlib.pyplot as plt
    bgr = cv2.imread("126.png")
    plt.style.use('default')
    plt.imshow(cv2.cvtColor(bgr, cv2.COLOR_BGR2RGB))
    plt.show()
    

    [image]

    matplotlib を用いて,OpenCV の濃淡画像を表示する例は次の通り.

    import cv2
    import matplotlib.pyplot as plt
    bgr = cv2.imread("126.png")
    mono = cv2.cvtColor(bgr, cv2.COLOR_BGR2GRAY)
    plt.style.use('default')
    plt.imshow(mono, cmap='gray')
    plt.show()
    

    [image]

    Matplotlib を用いて OpenCV 画像の表示するときに,小さく表示される場合

    普通に Matplotlib を用いてOpenCV 画像の表示を表示すると,小さく表示される.

    「plt.style.use('default') 」の実行により,Matplotlib での OpenCV 画像の表示が大きくなる.

    [image]

    関数のプロット

    matplotlib を用いたグラフ描画の例は次の通り.

    import numpy as np
    %matplotlib inline
    import matplotlib.pyplot as plt
    import warnings
    warnings.filterwarnings('ignore')   # Suppress Matplotlib warnings
    x = np.linspace(0, 6, 100)
    plt.style.use('ggplot')
    plt.plot(x, np.sin(x))
    

    [image]

    メッシュグリッドと関数の3次元プロット

    %matplotlib inline
    import matplotlib.pyplot as plt
    import warnings
    warnings.filterwarnings('ignore')   # Suppress Matplotlib warnings
    import numpy as np
    from mpl_toolkits.mplot3d import axes3d
    plt.style.use('ggplot')
    fig = plt.figure()
    ax = fig.add_subplot(111, projection = '3d')
    X, Y = np.meshgrid( np.array([-2, -1, 0, 1, 2]), np.array([-3, -2, -1, 0, 1, 2, 3]) )
    def f(x,y):
        return x * y
    Z = f(X, Y)
    ax.scatter(X, Y, Z, c='b')
    

    [image]

    メッシュグリッドと関数の3次元プロット. 今度は x1, x2 のソフトマックス関数

    %matplotlib inline
    import matplotlib.pyplot as plt
    import warnings
    warnings.filterwarnings('ignore')   # Suppress Matplotlib warnings
    import numpy as np
    from mpl_toolkits.mplot3d import axes3d
    plt.style.use('ggplot')
    fig = plt.figure()
    ax = fig.add_subplot(111, projection = '3d')
    X1, X2 = np.meshgrid( np.array([-2, -1, 0, 1, 2]), np.array([-3, -2, -1, 0, 1, 2, 3]) )
    def softmax(x):
        A = np.exp(x - np.max(x))
        return A / A.sum()
    def f(x1, x2):
        return softmax( np.array([x1, x2]) )
    Z = f(X1, X2)
    ax.scatter(X1, X2, Z[0], c='b')
    

    [image]
    fig = plt.figure()
    ax = fig.add_subplot(111, projection = '3d')
    ax.scatter(X1, X2, Z[1], c='b')
    

    [image]

    TensorFlow

    TensorFlow は,機械学習のアプリケーションを簡単に作成するのに役立つソフトウェア. Python, C/C++ 言語から利用可能. プロセッサ(CPU), GPU, Google TPU で動く Google 社のディープラーニング研究プロジェクトから出発し, 2015年11月に最初のリリースが行われた.ソースコード等は公開されている.

    TensorFlow のプログラム例 - 行列の足し算

    import tensorflow as tf
    import numpy as np
    a = tf.constant( np.reshape([1, 1, 1, 1, 1, 1], (2, 3) ) ) 
    b = tf.constant( np.reshape( [1, 2, 3, 4, 5, 6], (2, 3) ) )
    c = tf.add(a, b)
    
    print(c)
    

    [image]

    Keras

    Keras は,TensorFlow を用いてのディープラーニング(深層学習)でのモデルの構築と,その訓練(構築)を簡単に行えるようにするソフトウェア

    用語集

    ニューラルネットワークのデモサイト: http://playground.tensorflow.org

    手順

    1. パッケージのインポートなど
      from __future__ import absolute_import, division, print_function, unicode_literals
      
      # TensorFlow と tf.keras のインポート
      import tensorflow as tf
      import tensorflow_datasets as tfds
      from tensorflow import keras
      
      # ヘルパーライブラリのインポート
      import numpy as np
      %matplotlib inline
      import matplotlib.pyplot as plt
      import warnings
      warnings.filterwarnings('ignore')   # Suppress Matplotlib warnings
      
      print(tf.__version__)
      

      [image]
    2. 画像データセット MNIST の準備

      x_train: サイズ 28 × 28 の 60000枚の濃淡画像

      y_train: 60000枚の濃淡画像それぞれの,種類番号(0 から 9 のどれか) x_test: サイズ 28 × 28 の 10000枚の濃淡画像

      y_test: 10000枚の濃淡画像それぞれの,種類番号(0 から 9 のどれか)

      「+ コード」で,コードセルを追加し,次を実行.

      mnist, metadata = tfds.load(
          name="mnist", as_supervised=False, with_info=True, batch_size = -1)
      train, test = mnist['train'], mnist['test']
      print(metadata)
      
      x_train, y_train = train["image"].numpy().astype("float32") / 255.0, train["label"] 
      x_test, y_test = test["image"].numpy().astype("float32") / 255.0, test["label"]
      

      [image]
    3. 画像データセット MNIST の確認表示

      「+ コード」で,コードセルを追加し,次を実行.

      plt.style.use('default')
      plt.figure(figsize=(10,10))
      for i in range(25):
        plt.subplot(5,5,i+1)
        plt.xticks([])
        plt.yticks([])
        plt.grid(False)
        image, label = train["image"][i], train["label"][i]
        plt.imshow(image.numpy()[:, :, 0].astype(np.float32), cmap='gray')
        plt.xlabel(label.numpy())
      
      plt.show()
      

      [image]

    4. 「サイズ 28 × 28 の 60000枚の濃淡画像」であることを確認

      配列の形: 60000×28×28

      次元: 3

      「+ コード」で,コードセルを追加し,次を実行.

      print( x_train.shape )
      print( x_train.ndim )
      

      [image]
    5. ディープニューラルネットワークのモデルの作成

      2層のニューラルネットワークを作成

      1層目:ユニット数は 28 かける28

      2層目:ユニット数は 10

      「+ コード」で,コードセルを追加し,次を実行.

      「実行」をクリックして結果が何も出ないのは正常動作.

      m = tf.keras.Sequential()
      m.add(tf.keras.layers.Flatten(input_shape=(28, 28, 1)))
      m.add(tf.keras.layers.Dense(units=128, activation='relu'))
      m.add(tf.keras.layers.Dropout(rate=0.2))
      m.add(tf.keras.layers.Dense(units=10, activation='softmax'))
      m.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=0.001),
                    loss='sparse_categorical_crossentropy',
                    metrics=['accuracy'])
      

      [image]
    6. ニューラルネットワークの確認表示

      「+ コード」で,コードセルを追加し,次を実行.

      print(m.summary())
      

      [image]
    7. ニューラルネットワークの学習を行う

      「+ コード」で,コードセルを追加し,次を実行.

      history = m.fit(x_train, y_train, epochs=50)
      

      [image]
    8. 検証用データで検証する

      「+ コード」で,コードセルを追加し,次を実行.

      print( m.evaluate(x_test,  y_test, verbose=2) )
      

      ※ 訓練(学習)などで乱数が使われるので,下図と違う値になる.

      [image]
    9. ニューラルネットワークを使ってみる

      テスト画像を,ニューラルネットワークに与えて,予測させる

      テスト画像は 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 が書かれた画像である. 画像を読み取って,数字を予測する.

      「+ コード」で,コードセルを追加し,次を実行.

      predictions = m.predict(x_test)
      print(predictions[0])
      

      結果の見方. 0である確率,1である確率,2である確率,・・・9である確率と,10 個の 数字が,結果として得られる. 先ほど作成したニューラルネットワークの2層目は 10個のユニットがあった.各ユニットから1個の数字が得られている.

      ※ 訓練(学習)などで乱数が使われるので,下図と違う値になる.

      [image]
    10. 正解表示

      テスト画像 0 番の正解を表示

      「+ コード」で,コードセルを追加し,次を実行.

      print(y_test[0])
      

      ※ 訓練(学習)などで乱数が使われるので,下図と違う値になる.

      [image]

    ニューラルネットワークによる画像分類

    1. このページでは、次の画像を使うことにする

      2071.png のようなファイル名で保存しておく

      [image]
    2. 画像のアップロード操作
      1. ファイルをアップロードしたい.「ファイル」を選ぶ

        [image]
      2. アップロード」を選ぶ

        [image]
      3. アップロードしたいファイルを選ぶ

        [image]
    3. InceptionV3 を使うプログラム。Kerasのサイトで公開されているものを少し書き換えて使用。
      import h5py
      from tensorflow.keras.preprocessing import image
      from keras.applications.inception_v3 import preprocess_input, decode_predictions, InceptionV3
      import numpy as np
      
      m = InceptionV3(weights='imagenet')
      
      img_path = '2071.png'
      img = image.load_img(img_path, target_size=(299, 299))
      x = image.img_to_array(img)
      x = np.expand_dims(x, axis=0)
      x = preprocess_input(x)
      
      preds = m.predict(x)
      
      print('Predicted:')
      for p in decode_predictions(preds, top=5)[0]:
          print("Score {}, Label {}".format(p[2], p[1]))
      

      画像分類の結果(lab_coat, syringe, beaker, stethoscope, plate)と,それぞれの 確率が表示される.

      [image]

    式と変数

    変数は,変化するデータのこと. 「x = 100」のように書くと x の値が 100 に変化する

    の実行結果としてが得られる.式の中に,変数名を書くことができる.

    x = 100
    y = 200
    print(x + y)
    print( (x + 10) * y)
    

    [image]
    teihen = 2.5
    takasa = 5
    print(teihen * takasa / 2)
    

    [image]

    関数定義,関数オブジェクト

    関数定義は def, 帰り値は return

    式の抽象化と関数

    式の抽象化は,類似した複数の(下に書いた3つの式のようなもの)を, 変数を使って1つにまとめること.

    print(100 * 1.08) 
    print(150 * 1.08) 
    print(400 * 1.08) 
    

    [image]

    上の 3つの式を抽象化すると「a * 1.08」のようなになる.

    「a * 1.08」を本体式とするような関数 (関数名は foo)の定義とその使用例は次の通り. 関数の利用により,繰り返し同じことを書く(例えば「* 1.08」)ことを防ぐことができ,ミスを減らすこともできる.プログラムの変更も簡単になる.

    def foo(a):
        return a * 1.08 
    print(foo(100))
    print(foo(150))
    print(foo(400))
    

    [image]

    式の評価のタイミング

    関数の中の式の評価では, 最新の変数値が用いられる

    x = 30
    def foo(a):
        return(a * x) 
    x = 300
    print(foo(100))
    x = 3000
    print(foo(100))
    

    [image]

    クラス定義,オブジェクト生成,属性アクセス

    クラス定義,オブジェクト生成,属性アクセスの例

    クラス名: C

    その属性名: qty, weight, name

    class C(object):
        def __init__(self, qty, weight, name):
            self.qty = qty
            self.weight = weight  
            self.name = name
    
    x = C(5, 170.51, 'apple')
    y = C(3, 40.97, 'orange')
    print(vars(x))
    print(vars(y))
    print(x.name)
    print(y.name)
    

    vars はオブジェクトの属性名と値を取得する. 「x.name」,「y.name」は属性アクセスである.

    [image]

    getattr による属性値の取得

    クラス名: C

    その属性名: qty, weight, name

    class C(object):
        def __init__(self, qty, weight, name):
            self.qty = qty
            self.weight = weight  
            self.name = name
    
    x = C(5, 170.51, 'apple')
    y = C(3, 40.97, 'orange')
    print(getattr(x, 'qty'))
    print(getattr(y, 'weight'))
    

    getattr はオブジェクトと,属性名(文字列)を指定して,値を取得する.

    [image]

    setattr による属性の動的な追加

    クラス名: C

    その属性名: qty, weight, name

    class C(object):
        def __init__(self, qty, weight, name):
            self.qty = qty
            self.weight = weight  
            self.name = name
    
    x = C(5, 170.51, 'apple')
    y = C(3, 40.97, 'orange')
    setattr(x, 'color', 'red')
    print(vars(x))
    print(vars(y))
    

    setattr では,オブジェクトと,属性名(文字列)と値を指定する.

    [image]

    コンストラクタでの既定値(デフォルト値)

    既定値(デフォルト値)を設定している場合には,引数を省略できる.コンストラクタ以外のメソッドでも同様.

    クラス名: D

    属性名: s_hour, s_minute, e_hour, e_minute

    class D(object):
        def __init__(self, s_hour, s_minute):
            self.s_hour = s_hour
            self.s_minute = s_minute
            self.e_hour = None
            self.e_minute = None
    
    z = D(15, 30)
    z2 = D(16, 15)
    print(vars(z))
    print(vars(z2))
    

    [image]

    メソッド

    メソッドの例

    class C(object):
        def __init__(self, qty, weight, name):
            self.qty = qty
            self.weight = weight  
            self.name = name
        def total(self):
            return self.qty * self.weight
    
    x = C(5, 170.51, 'apple')
    print(vars(x))
    print(x.total())
    help(x)
    

    help は,メソッドの説明を表示する.

    [image]

    setattr によるメソッドの追加

    class C(object):
        def __init__(self, qty, weight, name):
            self.qty = qty
            self.weight = weight  
            self.name = name
        def total(self):
            return self.qty * self.weight
    
    x = C(5, 170.51, 'apple')
    setattr(C, 'hoge', lambda self: int(self.weight))
    print(x.hoge())
    help(x)
    

    スーパークラスからの継承

    クラス名: C

    その属性名: qty, weight, name

    クラス名: E

    その属性名: qty, weight, name, price

    クラス E は,スーパークラスであるクラス C の属性とメソッドを継承する

    class C(object):
        def __init__(self, qty, weight, name):
            self.qty = qty
            self.weight = weight  
            self.name = name
        def total(self):
            return self.qty * self.weight
    
    class E(C):
        def __init__(self, qty, weight, name, price):
            super(E, self).__init__(qty, weight, name)
            self.price = price
        def payment(self):
            return self.qty * self.price
    
    x2 = E(2, 875.34, 'melon', 500)
    print(vars(x2))
    print(x2.total())
    print(x2.payment())
    

    [image]