Python のまとめ

概要

このページは,Python の基礎から応用までの知識と手順をまとめている.Python の起動やインストール方法を Windows と Ubuntu の両方について説明し,複数バージョンの管理やパッケージ管理ツール pip の使い方も解説する.Python の隔離環境 venv や Anaconda3 といった環境設定も記載する.Python プログラムの例として,グラフ描画,画像ファイルの操作,主成分分析,k-means クラスタリングなどを紹介する.Python 開発環境として,Jupyter Notebook,Jupyter Lab,Nteract,Spyder のインストール方法と起動方法を解説する.Python のプログラミング基礎,データ型,モジュールとライブラリ,クラス定義とオブジェクト生成,制御構造,関数定義についても扱う.Python でできること,Python での書き方をすばやく確認できるページである.

目次

関連する外部ページ

サイト内の関連情報

第1章 開発環境のセットアップ

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

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

Google Colaboratory では,Web ブラウザを用いて次のことができる.

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

    https://colab.research.google.com

  2. ファイル」で、「ノートブックを新規作成」を選ぶ
  3. Google アカウントでのログインが求められたときはログインする
  4. コードセルの中に Python プログラムを書き、「再生ボタン」をクリック
  5. コードセルを追加したいときは、「挿入」で、「コードセル」をクリック
Google Colaboratoryの使い方

スライド資料

「Colaboratoryへようこそ」のページのURL: https://colab.research.google.com/notebooks/welcome.ipynb?hl=ja

Google Colaboratory での pip の操作

Google Colaboratoryではpipを次のように操作する.頭に「!」を付ける

Windows での Python の起動

WindowsでのPythonのインストール: 別項目 »で説明

Python のコマンドでの実行

コマンドプロンプトで以下のコマンドを実行する.

python

Windowsで複数のPythonをインストールしているときは,環境変数Pathで先頭のPythonが使用される.

Python ランチャー py でのバージョン指定実行

Pythonランチャーを使用すると,バージョンを指定してPythonを実行できる.

py -<Pythonのバージョン>

インストールされているPythonのバージョンは「py -0」で確認できる.

venv を使用する場合

venvを使うときは,activateコマンドを実行した後,「python」で起動する.

Windows での Python のインストール

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

Python 3.12 のインストール(Windows 上)

以下のいずれかの方法で Python 3.12 をインストールする.Python がインストール済みの場合,この手順は不要である.

方法1:winget によるインストール

管理者権限コマンドプロンプトを起動する (手順:Windowsキーまたはスタートメニュー → cmd と入力 → 右クリック → 「管理者として実行」).次のコマンドを実行する.

winget install --id Python.Python.3.12 -e --scope machine --silent --accept-source-agreements --accept-package-agreements --override "/quiet InstallAllUsers=1 PrependPath=1 Include_test=0 Include_pip=1 Include_launcher=1 InstallLauncherAllUsers=1 TargetDir=\"C:\Program Files\Python312\""
powershell -Command "$p='C:\Program Files\Python312'; $s=\"$p\Scripts\"; $m=[Environment]::GetEnvironmentVariable('Path','Machine'); if($m -notlike \"*$s*\") { [Environment]::SetEnvironmentVariable('Path', \"$p;$s;$m\", 'Machine') }"

--scope machine を指定すると,システム全体(全ユーザー向け)にインストールされる.このオプションの実行には管理者権限が必要である.インストール完了後,コマンドプロンプトを再起動すると PATH が反映される.

方法2:インストーラーによるインストール

  1. Python 公式サイト(https://www.python.org/downloads/)にアクセスし,「Download Python 3.x.x」ボタンから Windows 用インストーラーをダウンロードする.
  2. ダウンロードしたインストーラーを実行する.
  3. 初期画面の下部に表示される「Add python.exe to PATH」にチェックを入れてから「Customize installation」を選択する.このチェックを入れ忘れると,コマンドプロンプトから python コマンドを実行できない.
  4. 「Install Python 3.xx for all users」にチェックを入れ,「Install」をクリックする.

インストールの確認

python --version

バージョン番号(例:Python 3.12.x)が表示されればインストール成功である.

Python 3.9 / 3.10 のインストール(従来のインストーラー手順)

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

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

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

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

    URL: https://pypi.org/project/tensorflow/2.10/#files

  2. Python の URL を開く

    URL: https://www.python.org

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

    ページの上の方にある「Downloads」をクリック.「Windows」をクリック

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

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

  5. ファイルの種類を選ぶ.「Windows Installer (64-bit)」を選ぶ
  6. ダウンロードが始まる
  7. インストール時の設定
    1. いまダウンロードした .exe ファイルを右クリック,「管理者として実行」を選ぶ.
    2. Python ランチャーをインストールするために,「Install launcher for all users (recommended)」をチェック.
      * すでに Python ランチャーをインストール済みのときは,「Install launcher for all users (recommended)」がチェックできないようになっている場合がある.そのときは,チェックせずに進む.
    3. Add Python.exe to PATH」をチェック.
    4. Customize installation」をクリック.
    5. オプションの機能 (Optional Features) は,既定(デフォルト)のままでよい.「Next」をクリック
    6. Install Python 3.10 for all users」を選ぶ.
    7. Python のインストールディレクトリが,「C:\Program Files\Python310」のように自動設定されることを確認.
    8. Install」をクリック
    9. インストールが始まる
    10. Disable path length limit」が表示される場合がある.クリックして,パス長の制限を解除する.
    11. インストールが終了したら,「Close」をクリック
  8. インストールのあと,Windows のスタートメニューに「Python 3.10」が増えていることを確認.
  9. システムの環境変数 Path の確認のため,新しくコマンドプロンプトを開き,次のコマンドを実行する.
    where py
    where pip
    

    where py では「C:\Windows\py.exe」が表示され, where pip では「C:\Program Files\Python310\Scripts\pip.exe」が表示されることを確認.

pip と setuptools の更新

  1. 以下の手順を管理者権限コマンドプロンプトで実行する (手順:Windowsキーまたはスタートメニュー → cmd と入力 → 右クリック → 「管理者として実行」).
  2. 次のコマンドを実行する.
    python -m pip install -U --no-user pip setuptools
    

Python に関しての情報取得

  1. Windowsシステム環境変数 Path を確認する

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

  2. Python にパスが通っていることの確認
    where python
  3. python のバージョンの確認
    python --version
    
  4. Python のビルドに用いられたコンパイラのバージョン番号の確認
    python
    
  5. exit() で終了
  6. pip の動作確認
    pip list
    

Windows で Python のアンインストール

  1. まず,Windows で Python のアンインストール操作を行う.
  2. 次に,Python 関係のファイルの削除を行う.

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

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

    次のコマンドは,rmdir で %APPDATA%\Python ディレクトリを再帰的に削除し,次に "C:\Program Files" に移動して Python3 で始まるディレクトリを再帰的に削除する.
    rmdir /s /q %APPDATA%\Python
    cd "C:\Program Files"
    for /F %i in ('dir /ad /b /w Python3*') do rmdir /s /q %i
    

Windows での複数の Python の同時インストール

Windowsでは,Python の 3.7.x,3.8.x,3.9.x,3.10.x のように,複数のバージョンの Python を同時にインストールできる.

ただし,3.10.4 と 3.10.5 のように,3桁目だけが異なるものは同時にインストールできない(2桁目までが異なるものは同時にインストールできる).

そのときは,環境変数 Path の設定を意識すること.Pythonランチャーである「py」コマンドも利用すること.

Windows の Python ランチャー py

Pythonランチャーは,Windows で動くツールである.複数バージョンの Python を同時にインストールしたときに便利である.

Pythonの起動

Windows のPythonランチャーを用いて,次のように使用する Python のバージョンを指定できる:

「py -X」のように,バージョン指定の中の「-32」,「-64」を省略することもできる.そのときは Python バージョン X が実行されるが,X の 32ビット版と 64ビット版の両方をインストールしている場合は,64ビット版が実行される.

「py」のようにバージョン指定を省略したときは,インストールされている Python の最新バージョンが実行される.

インストールされている Python バージョンの一覧表示

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

Ubuntu の Python,Ubuntu での Python のインストール,pip と setuptools の更新

Ubuntu の システム Python

Ubuntu をインストールすると,Ubuntu のシステム Python も同時にインストールされる.Ubuntu の場合はシステム Python を用いる(その場合はインストール不要)か,pyenv などを用いて,システム Python とは隔離した形でインストールする.

Ubuntu のシステム Python を用いるとき,python,pip は,次のコマンドで起動できる:

次の実行により,「python」や「pip」で「3」を付けなくても済むようになる:

sudo apt -y install python-is-python3

システム Python を使っているときの pip と setuptools の更新(Ubuntu 上)

sudo apt update
sudo apt -y install python3-pip python3-setuptools

Ubuntu での Python のインストール(pyenv を使用)

Ubuntu で,システム Python 以外の Python をインストールするには pyenv の利用が便利である.pyenv は,Linux,macOS で動く Python バージョン管理のツールである.

Ubuntu をインストールすると,Ubuntu のシステム Python も同時にインストールされる.Ubuntu では,システム Python は Ubuntu システムの動作に関わっている.システム Python をバージョンアップしたりアンインストールしたりするのは避ける.

pyenv のインストール

pyenv の URL: https://github.com/pyenv/pyenv

sudo apt -y update
sudo apt -y install --no-install-recommends make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev
cd /tmp
curl https://pyenv.run | bash
echo 'export PYENV_ROOT="${HOME}/.pyenv"' >> ~/.bashrc
echo 'if [ -d "${PYENV_ROOT}" ]; then' >> ~/.bashrc
echo '    export PATH=${PYENV_ROOT}/bin:$PATH' >> ~/.bashrc
echo '    eval "$(pyenv init -)"' >> ~/.bashrc
echo '    eval "$(pyenv virtualenv-init -)"' >> ~/.bashrc
echo 'fi' >> ~/.bashrc
exec $SHELL -l

pyenv の利用

# インストール可能なPythonの一覧表示
pyenv install -l

# Pythonのインストール
pyenv install <バージョン指定>

# インストール済みのPythonの確認
pyenv version

# Pythonの有効化
pyenv shell <バージョン指定>

# pyenvのアンインストール
rm -rf ~/.pyenv
pyenv についての詳細説明: 別ページ »で説明

Ubuntu での Python の起動

Python の隔離された環境 venv

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

venv は Python 3 の標準機能である.

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

Python の隔離された環境の新規作成

既定(デフォルト)では,Python の隔離された環境に,システムの site package は含まれない.

Windows:

python -m venv <ディレクトリ名>
(環境変数Pathで先頭のPythonが使用される)
py <Pythonのバージョン指定> -m venv <ディレクトリ名>
(PythonランチャーによるPythonのバージョン指定)

Ubuntu:

python3 -m venv <ディレクトリ名>

Python の隔離された環境の有効化

Windows:

<ディレクトリ名>\Scripts\activate.bat

Ubuntu:

source <ディレクトリ名>/bin/activate

Python の隔離された環境の無効化

deactivate

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

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

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

    python -m venv %HOMEPATH%\.venv
    dir /w %HOMEPATH%\.venv
    
  3. Python の隔離された環境の有効化
    %HOMEPATH%\.venv\Scripts\activate.bat
    
  4. パッケージを確認する
    いま,venv を使用中かどうかは,プロンプトの「(venv)」で分かる.
    python -m pip list
    
  5. 現在使用している Python の隔離された環境の無効化
    deactivate
    

Windows の Python ランチャーでバージョン指定して,Python の仮想環境を扱う(venv を使用)

  1. Python ランチャーで,インストール済みの Python のバージョンを確認
    py -0
    
  2. 新しい Python の仮想環境の新規作成

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

    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 の場合)

  1. python3-venv のインストール
    # パッケージリストの情報を更新
    sudo apt update
    sudo apt -y install python3-venv
    
  2. 使用している システム Python のバージョンの確認
    python3 --version
    
  3. Python の仮想環境の作成

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

    python3 -m venv ~/.venv
    ls -la .venv
    
  4. Python の隔離された環境の有効化
    source ~/.venv/bin/activate
    
  5. パッケージを確認する
    python -m pip list
    
  6. 現在使用している Python の隔離された環境の無効化
    deactivate
    

virtualenv,virtualenv-wrapper

virtualenv,virtualenv-wrapper は,Python の仮想環境の作成ができるソフトウェアである.venv が対応していない Python を使いたい場合には,virtualenv,virtualenv-wrapper が便利な場合がある.

virtualenv-wrapper の使い方:

Windows で virtualenv,virtualenv-wrapper をインストールする手順:

python -m pip install -U --no-user pip setuptools
python -m pip install -U --no-user virtualenv virtualenvwrapper-win

Windows で Python 3 の仮想環境を新規作成するときの操作例:

mkvirtualenv py3

Anaconda3

Anaconda3 は,Anaconda Inc. 社が提供している Python バージョン3のソフトウェアである.言語処理系,開発ツール,パッケージ管理ツール conda,さまざまな Python パッケージから構成されている.

関連する外部ページ

Anaconda3 のインストール(winget を使用)(Windows 上)

  1. Windows で,管理者権限コマンドプロンプトを起動する (手順:Windowsキーまたはスタートメニュー → cmd と入力 → 右クリック → 「管理者として実行」).
  2. 次のコマンドを実行する.
    winget install --scope machine Anaconda.Anaconda3
    powershell -command "$oldpath = [System.Environment]::GetEnvironmentVariable(\"Path\", \"Machine\"); $oldpath += \";C:\ProgramData\Anaconda3;C:\ProgramData\Anaconda3\Scripts\"; [System.Environment]::SetEnvironmentVariable(\"Path\", $oldpath, \"Machine\")"
    
  3. Windows のスタートメニューに「Anaconda3 (64-bit)」が追加される.

Anaconda Prompt

Anaconda Prompt は,Anaconda3 に同封されたコマンドプロンプトのソフトウェアである.

conda で Python の隔離された環境

conda の利用により,バージョンや搭載パッケージが異なる複数の Python 環境を共存させることができる.

conda create --name py39 python=3.9
Anaconda3 でのパッケージ管理は pip ではなく conda を用いる.Anaconda3 は pip の使用を想定していない.

Anaconda3 の Python のパスの設定

このサイトでは,システムの環境変数 PATH の先頭部分に,次の5つが設定されているものとして説明している.

C:\ProgramData\Anaconda3
C:\ProgramData\Anaconda3\Library\mingw-w64\bin
C:\ProgramData\Anaconda3\Library\usr\bin
C:\ProgramData\Anaconda3\Library\bin
C:\ProgramData\Anaconda3\Scripts

Windows での Python と Anaconda 内の Python の共存

Anaconda3 内蔵の Python を使いたいときは,py コマンドは使わない.パスを通すか,フルパスで指定するか,Anaconda Prompt を使う.

すでに Python をインストール済みの場合でも,Anaconda3両立できる

Anaconda3 では pip を使わないこと.Anaconda3 は pip の使用を想定していない.

Python の種々のバージョン

Python の公式ページ: https://www.python.org/

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

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

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

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

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

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

管理者権限コマンドプロンプトを起動する (手順:Windowsキーまたはスタートメニュー → cmd と入力 → 右クリック → 「管理者として実行」).次のコマンドを実行する.

python -m pip install -U --no-user pip setuptools requests notebook==6.5.7 jupyterlab jupyter jupyter-console jupytext PyQt5 nteract_on_jupyter spyder

Ubuntu での Jupyter Qt Console, JupyterLab の起動とインストール

# パッケージリストの情報を更新
sudo apt update
sudo apt -y install python-is-python3 python3-dev python-dev-is-python3 python3-pip python3-setuptools python3-venv build-essential
sudo pip3 uninstall -y ptyprocess sniffio terminado tornado jupyterlab jupyter jupyter-console jupytext nteract_on_jupyter spyder
sudo apt -y install jupyter jupyter-qtconsole spyder3
sudo apt -y install python3-ptyprocess python3-sniffio python3-terminado python3-tornado
sudo pip3 install -U jupyterlab jupyter jupyter-console jupytext nteract_on_jupyter
複数の Python バージョンを共存しているときは, pyenv を使い,次のようにバージョン指定する.

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

Jupyter Notebook の保存設定

Jupyter Notebook で,保存のときに .py ファイルと .ipynb ファイルの両方が保存されるように設定する(この設定を行わないときは .ipynb ファイルのみが保存される).

  1. 次のコマンドで,設定ファイルを生成する
    jupyter notebook --generate-config
    
  2. jupyter/jupyter_notebook_config.py を編集し,末尾に次を追加する

    c.NotebookApp.contents_manager_class = "jupytext.TextFileContentsManager"

第2章 Python 関係のツール

pip

pip は Python のパッケージマネージャである.

Windows

Ubuntu

Python パッケージ・インデックス (PyPI)

パッケージの検索や調査を行うときに,次の URL を使う:

Python パッケージ・インデックス (PyPI) の URL: https://pypi.org/

Google Colaboratory での pip の操作

Google Colaboratory では pip を次のように操作する.頭に「!」を付ける

Windows での pip の操作

Windows では pip を次のように操作する.

Ubuntu での pip の操作

Ubuntu でシステム Python を使う場合は,pip を次のように操作する:

pip と setuptools を最新版に更新

pip のインストールを手動で行いたい場合

Python の setup.py の実行

git clone https://github.com/openai/gym
cd gym
pip install -e .

必要に応じて,次のように操作する:

git clone https://github.com/openai/gym
cd gym
python setup.py build
python setup.py install
Python の setup.py を用いて,wheel 形式の pip パッケージを作成したいとき:
python -m pip install --no-user wheel
python setup.py bdist_wheel

Python の build_ext の実行

python -m pip install pillow==6 --global-option="build_ext" --global-option="--disable-jpeg" --global-option="--disable-zlib"

2to3

2to3 は,Python バージョン2用のソースコードを Python バージョン3用に変換するプログラムである:

2to3 -w .

第3章 Python 開発環境,Python コンソール(Jupyter Qt Console,Jupyter ノートブック,Jupyter Lab,Nteract,spyder,PyCharm)

Python,pip,Python 開発環境,Python コンソールのコマンドでの起動

Windows の場合

Windows の Python ランチャーでバージョン指定する場合

Ubuntu の場合

Windows での Python 開発環境として,Jupyter Qt Console,Jupyter ノートブック (Jupyter Notebook),Jupyter Lab,Nteract,spyder のインストール

Windows では,管理者権限コマンドプロンプトを起動する (手順:Windowsキーまたはスタートメニュー → cmd と入力 → 右クリック → 「管理者として実行」).次のコマンドを実行する.

python -m pip install -U --no-user pip setuptools requests notebook==6.5.7 jupyterlab jupyter jupyter-console jupytext PyQt5 nteract_on_jupyter spyder

Python ランチャーでバージョン指定する場合(Python 3.10 を使う場合):

py -3.10 -m pip install -U --no-user pip setuptools requests notebook==6.5.7 jupyterlab jupyter jupyter-console jupytext PyQt5 nteract_on_jupyter spyder

Ubuntu での Python 開発環境として,Jupyter Qt Console,Jupyter ノートブック (Jupyter Notebook),Jupyter Lab,Nteract,spyder のインストール

# パッケージリストの情報を更新
sudo apt update
sudo apt -y install python-is-python3 python3-dev python-dev-is-python3 python3-pip python3-setuptools python3-venv build-essential
sudo pip3 uninstall -y ptyprocess sniffio terminado tornado jupyterlab jupyter jupyter-console jupytext nteract_on_jupyter spyder
sudo apt -y install jupyter jupyter-qtconsole spyder3
sudo apt -y install python3-ptyprocess python3-sniffio python3-terminado python3-tornado
sudo pip3 install -U jupyterlab jupyter jupyter-console jupytext nteract_on_jupyter

Python コンソール

Python コンソールは,Python のシェルの画面のことである.プロンプトが出て Python のプログラムを受け付け,その実行結果を表示する.

Jupyter Qt Console の実行例

次の Python プログラムを実行してみる(sin 関数のグラフを描画):

import numpy as np
%matplotlib inline
import matplotlib.pyplot as plt

x = np.linspace(0, 6, 100)
plt.style.use('default')
plt.plot(x, np.sin(x))

Jupyter ノートブック (Jupyter Notebook)

Jupyter ノートブックは,Python などのプログラムのソースコードと実行結果を1つのノートとして残す機能を持ったノートブックである.

起動は「jupyter notebook」または「py -3.10 -m notebook」(Python 3.10 を使う場合)

Jupyter Lab

Jupyter Lab は,Python プログラム作成のための機能を持ったソフトウェアである.

起動は「jupyter lab」または「py -3.10 -m jupyterlab」(Python 3.10 を使う場合)

Nteract

Nteract は,Python などのプログラムのソースコードと実行結果を1つのノートとして残す機能を持ったノートブックである.

起動は「jupyter nteract
import numpy as np
%matplotlib inline
import matplotlib.pyplot as plt

x = np.linspace(0, 6, 100)
plt.style.use('default')
plt.plot(x, np.sin(x))

PyScripter

PyScripter は,Python プログラム作成のための機能を持ったソフトウェアである.

Windows での PyScripter のインストールは,別ページ »で説明している.

Blender の Python コンソール

Blender に内蔵された Python のコンソールである.Blender 3.0 では次の手順で開くことができる.

画面として「Pythonコンソール」を選ぶ.

spyder

Windows で Anaconda3 をインストールしたときは,スタートメニューの「Anaconda3 (64-bit)」の下に「Spyder」があるので,これを使って実行するのが簡単である.

Ubuntu では「spyder」で実行する.

PyCharm

PyCharm は,Python プログラム作成のための機能を持ったソフトウェアである.次の機能を持つ:

PyCharm では,既定(デフォルト)で Python の仮想環境が利用される.

【PyCharm Community 版の主な機能】

第4章 Python の基礎

式と変数

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

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

x = 100
y = 200
print(x + y)
print( (x + 10) * y)
teihen = 2.5
takasa = 5
print(teihen * takasa / 2)

単純値のデータ型

文字列の演算子

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

空白などで区切られたテキストをリストに変換

import re

def removeletters(s):
    return re.sub(r':|\||-', ' ', s)

def getdata(s):
    m = re.match(r'[0-9]+(b|B|k|K|m|M|g|G|t|T)*', s)
    if m:
        return m.group()
    else:
        return ''

s = 'system 07-09 15:00:03|  0   0 100   0   0:  0   0 100   0   0:  0   0 100   0   0:  0   0 100   0   0:  1   0  99   0   0:  0   0 100   0   0:  0   0 100   0   0:  0   0 100   0   0|   0    40k| 173   243 |0.03 0.05    0|1856M 14.1G 1553M 13.1G'
a = removeletters(s)
b = a.split()
print(list(map(getdata, b)))

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

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

条件分岐

繰り返し

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

for による繰り返し

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

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

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

式の抽象化と関数

式の抽象化は,類似した複数のを,変数を使って1つにまとめることである.

以下は「式の抽象化」を説明するための例である(値 1.08 は説明用であり,現行の消費税率とは異なる).
print(100 * 1.08)
print(150 * 1.08)
print(400 * 1.08)

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

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

式の評価のタイミング

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

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

Python のモジュール

Python のモジュールは,1つ以上の関数を1つのファイルに集めたものである.

以下の tax 関数は説明用の例であり,値 1.08 は現行の消費税率とは異なる.
def tax(x):
    return x * 1.08

if __name__ == "__main__":
    print(tax(100))
上に書いたモジュールを他のプログラムでインポートして使いたいときは, まずモジュールを「hoge.py」のようなファイル名で保存する.そして,プログラムを 次のように書く.
import hoge
print(hoge.tax(10))

Python のライブラリ

現在の日時

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

最大公約数

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

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

方程式を解く

4x + 1 = 0 を解く.

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

平方根

面積が 7 の正方形の一辺の長さを求める.

import math
print( math.sqrt(7) )

円の面積

半径 3 の円の面積を求める.

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

三角形の面積

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

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

第5章 オブジェクト指向プログラミング

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

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

キーワード: =, 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) )
import collections
Point3d = collections.namedtuple('Point3d', 'x y z')
p = Point3d(10, 20, 30)
print( type(p) )
import numpy as np
print( type(np.zeros(10)) )

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

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

以下のコード例では class C(object): のように明示的に object を継承する形式で記述している.これは Python 2 との互換性を意識した書き方であり,Python 3 では class C: と書いても同じ動作をする(Python 3 ではすべてのクラスが暗黙的に object を継承するため).

クラス名: 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)

getattr による属性値の取得

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'))

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

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))

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

クラス名: 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))

メソッド

メソッドの例

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)

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())

第6章 データ構造と配列処理

リスト

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

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

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

numpy 全般

次元数

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

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

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

numpy の2次元の配列の次元数2 である.

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

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

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

1次元の配列のデータ型は numpy.ndarray である.配列の要素のデータ型は dtype で表示する. 「float64」は浮動小数点数である.

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

1次元の配列

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

1次元の配列の生成

合計

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

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

2次元の配列

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

乱数(正規分布)

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

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))

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

時間計測も行う.CuPy は GPU を用いた数値計算ライブラリであり,Google Colaboratory の GPU ランタイムなどで利用できる.

CuPy は,CUDA のバージョンに合わせた wheel をインストールする.CUDA 12.x では「!pip3 install cupy-cuda12x」のように指定する(バージョンに応じて cupy-cuda11x などを使う).

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

次のプログラムは,NumPy と scikit-learn を使用して行列計算とデータ分析を行う.
  1. 2000×2000 の乱数行列 X と Y を生成し,それらの行列積を計算する.
  2. scikit-learn の PCA を使用して,X の主成分分析を行い,2次元に次元削減する.
  3. NumPy の svd 関数を使用して,X の特異値分解を行う.
  4. scikit-learn の KMeans を使用して,X に対して10クラスタの 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)

CSV ファイル読み込み.

import pandas as pd
pd.read_csv("XX.csv", header=None)
import pandas as pd
pd.read_csv("YY.csv", header=None)

メッシュグリッド

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)

配列の次元を増やす

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)

pandas データフレーム

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

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

このデータ(CSV ファイル)のダウンロードは, Windows で管理者権限コマンドプロンプトを起動し (手順:Windowsキーまたはスタートメニュー → cmd と入力 → 右クリック → 「管理者として実行」),次のコマンドを実行する.

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

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

  1. アンケートデータの読み込み
    import pandas as pd
    import seaborn as sns
    
    x = pd.read_csv('C:/enquete.csv', encoding='SHIFT-JIS')
    
  2. 読み込んだデータの表示
    print(x)
    
  3. 読み込んだデータのうち,1列目と2列目の表示
    print(x.iloc[:,1])
    print(x.iloc[:,2])
    
  4. 読み込んだデータについて,1列目と2列目の散布図
    %matplotlib inline
    import matplotlib.pyplot as plt
    plt.style.use('ggplot')
    plt.plot(x.iloc[:,1], x.iloc[:,2], 'ro')
    plt.show()
    
  5. 各列について,基本的な情報の表示
    print(x.head())
    print(x.info())
    print(x.shape)
    print(x.ndim)
    print(x.columns)
    
  6. CSV ファイルに書き出し
    x.to_csv('hoge.csv', header=True, index=False, encoding='SHIFT-JIS')
    

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

print(x.describe())

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

x.to_json('hoge.json')        # x は pandas の DataFrame
a = pd.read_json('hoge.json')

pandas.DataFrame のコンストラクタ

ヒストグラムの表示

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

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

2次元ヒストグラム

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

第7章 データの可視化

IPython.display を用いた画像表示

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

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

IPython.display を使って表示する方法:

from PIL import Image
from IPython.display import display

filename = '127.png'
img = Image.open(filename)
display(img)

Matplotlib を用いたプロット

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

散布図

3次元散布図

%matplotlib inline
import matplotlib.pyplot as plt
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')

Matplotlib を用いた種々のプロット

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()

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()

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

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

関数のプロット

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

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

%matplotlib inline
import matplotlib.pyplot as plt
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')

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

%matplotlib inline
import matplotlib.pyplot as plt
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')
fig = plt.figure()
ax = fig.add_subplot(111, projection = '3d')
ax.scatter(X1, X2, Z[1], c='b')

第8章 機械学習フレームワーク

TensorFlow

TensorFlow は,Google が開発した機械学習フレームワークである.Python,C/C++ 言語から利用可能で,CPU,GPU,TPU 上で動作する.TensorFlow の特徴として「データフローグラフ」がある.これは「データの流れ」を表現するもので,グラフの節点は演算(オペレーション)を,エッジはデータ(テンソル)の流れを表す.TensorFlow を使用することで,音声,画像,テキスト,ビデオなど多様なデータを扱う機械学習アプリケーションの開発ができる.

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)

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
    
    print(tf.__version__)
    
  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"]
    
  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()
    
  4. 「サイズ 28 × 28 の 60000枚の濃淡画像」であることを確認
    配列の形: 60000×28×28

    次元: 3

    print( x_train.shape )
    print( x_train.ndim )
    
  5. ディープニューラルネットワークのモデルの作成
    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'])
    
  6. ニューラルネットワークの確認表示
    print(m.summary())
    
  7. ニューラルネットワークの学習を行う
    history = m.fit(x_train, y_train, epochs=50)
    
  8. 検証用データで検証する
    print( m.evaluate(x_test,  y_test, verbose=2) )
    
  9. ニューラルネットワークを使ってみる
    predictions = m.predict(x_test)
    print(predictions[0])
    
  10. 正解表示
    print(y_test[0])
    

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

  1. このページでは次の画像を使う

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

  2. 画像のアップロード操作
    1. ファイルをアップロードするため,「ファイル」を選ぶ
    2. アップロード」を選ぶ
    3. アップロードしたいファイルを選ぶ
  3. InceptionV3 を使うプログラム.Keras のサイトで公開されているものを少し書き換えて使用する.
    from tensorflow.keras.preprocessing import image
    from tensorflow.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)と,それぞれの確率が表示される.

ConvNeXt による画像分類

ImageNet で学習済みの ConvNeXtBase モデルを用いた画像分類を行う.

  1. パソコン接続のカメラを使用するので準備しておく.
  2. 前準備として opencv-python のインストールを行う.
    python -m pip install -U --no-user opencv-python opencv-contrib-python
    
  3. エディタを起動し,次のプログラムを保存する(メモ帳を用いる場合は a.py のようなファイル名で保存して実行).このプログラムは,TensorFlow,ConvNeXtBase モデルを用いて,カメラから取得した画像をリアルタイムで画像分類する:
    import tensorflow as tf
    from tensorflow.keras.applications import ConvNeXtBase
    import numpy as np
    import time
    import cv2
    
    def set_gpu_config():
        physical_devices = tf.config.list_physical_devices('GPU')
        if len(physical_devices) > 0:
            print("GPU available:", physical_devices)
            for device in physical_devices:
                tf.config.experimental.set_memory_growth(device, True)
        else:
            print("No GPU found. Running on CPU.")
    
    def preprocess_image(img):
        img = cv2.resize(img, (224, 224))
        img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
        img = np.expand_dims(img, axis=0)
        img = tf.keras.applications.convnext.preprocess_input(img)
        return img
    
    def load_model():
        return ConvNeXtBase(weights='imagenet')
    
    def classify_camera_frames(model):
        cap = cv2.VideoCapture(0)
    
        while cap.isOpened():
            ret, frame = cap.read()
            if not ret:
                break
    
            img = preprocess_image(frame)
    
            start_time = time.perf_counter()
            preds = model.predict(img)
            end_time = time.perf_counter()
            prediction_time = end_time - start_time
    
            top_pred_index = np.argmax(preds)
            class_label = tf.keras.applications.convnext.decode_predictions(preds, top=1)[0][0][1]
            confidence = preds[0][top_pred_index]
    
            cv2.putText(frame, f"Class: {class_label}", (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)
            cv2.putText(frame, f"Confidence: {confidence:.4f}", (10, 70), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)
            cv2.putText(frame, f"Time: {prediction_time:.4f} seconds", (10, 110), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)
    
            cv2.imshow("Camera Classification", frame)
    
            if cv2.waitKey(1) & 0xFF == ord('q'):
                break
    
        cap.release()
        cv2.destroyAllWindows()
    
    def main():
        set_gpu_config()
        model = load_model()
        classify_camera_frames(model)
    
    if __name__ == '__main__':
        main()
    
  4. Python プログラムの実行を行う.
    python a.py
    
  5. 結果の確認を行う.終了は q キーである.

第9章 ファイルの選択

ファイルダイアログ(tkinter を使用)

次の Python プログラムは,tkinter の filedialog を使用し,ファイルを選択するためのダイアログを表示する:

import tkinter as tk
from tkinter import filedialog

root = tk.Tk()
root.withdraw()
fpath = filedialog.askopenfilename()
print("Selected file: ", fpath)

次の Python プログラムは,tkinter の filedialog を使用し,複数のファイルを選択するためのダイアログを表示する:

import tkinter as tk
from tkinter import filedialog

root = tk.Tk()
root.withdraw()
fpaths = filedialog.askopenfilenames()

for fpath in root.tk.splitlist(fpaths):
    print("Selected file: ", fpath)

ファイルを複数選択(gooey を使用)

「python -m pip install -U --no-user gooey」でインストールを行っておく.

from gooey import Gooey, GooeyParser

@Gooey(required_cols=0)
def main():
    parser = GooeyParser(description='Process something.')

    parser.add_argument('-i', '--infiles', nargs='*', metavar='InFiles', help='Choose one file or more-than-on files!', widget="MultiFileChooser")
    parser.add_argument('-n', '--name', metavar='Name', help='Enter some text!')
    parser.add_argument('-f', '--foo', metavar='Flag 1', action='store_true', help='I turn things on and off')
    parser.add_argument('-b', '--bar', metavar='Flag 2', action='store_true', help='I turn things on and off')

    a = parser.parse_args()
    print(a.infiles)
    print(a.name)
    print(a.foo)
    print(a.bar)

if __name__ == '__main__':
    main()

第10章 画像ファイルの表示,画像ファイルの画像のサイズの取得

PIL の show を使用して画像ファイルを表示する:

from PIL import Image
Image.open('1.png').show()

Matplotlib を使用して画像ファイルを表示する:

import matplotlib.pyplot as plt
import matplotlib.image as mpimg

img = mpimg.imread('1.png')
plt.imshow(img)
plt.show()

PIL を使用して画像のサイズを取得する:

from PIL import Image

image_path = '1.png'
width, height = Image.open(image_path).size
print(width, height)

第11章 ply ファイルの表示

次のプログラムは,ファイルダイアログにより ply ファイルを1つ選択ののち表示を行う.マウスの左クリックとマウス移動により回転でき,マウスホイールにより前後移動する.

import pygame
from pygame.locals import *
from OpenGL.GL import *
from OpenGL.GLUT import *
from OpenGL.GLU import *
from plyfile import PlyData, PlyElement

# PLYファイルを読み込む
import tkinter as tk
from tkinter import filedialog

root = tk.Tk()
root.withdraw()
fpath = filedialog.askopenfilename()

plydata = PlyData.read(fpath)
vertex_data = plydata['vertex'].data
face_data = plydata['face'].data

# 頂点と面をリストとして取得
vertices = [list(elem) for elem in vertex_data]
faces = [face[0] for face in face_data]

# PygameとOpenGLを初期化
pygame.init()
display = (800, 600)
pygame.display.set_mode(display, DOUBLEBUF | OPENGL)
gluPerspective(45, (display[0] / display[1]), 0.1, 50.0)
glTranslatef(0.0, 0.0, -5)

# マウス操作のための変数
rotation_enabled = False
rotation_start = (0, 0)
zoom = 0.0

# メインループ
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            quit()
        elif event.type == pygame.MOUSEBUTTONDOWN:
            if event.button == 1:  # 左クリック
                rotation_enabled = True
                rotation_start = pygame.mouse.get_pos()
            elif event.button == 4:  # ホイール回転(上方向)
                zoom = 1
            elif event.button == 5:  # ホイール回転(下方向)
                zoom = -1
        elif event.type == pygame.MOUSEBUTTONUP:
            if event.button == 1:  # 左クリック解除
                rotation_enabled = False
        elif event.type == pygame.MOUSEMOTION:
            if rotation_enabled:
                dx = event.pos[0] - rotation_start[0]
                dy = event.pos[1] - rotation_start[1]
                glRotatef(dx, 0, 1, 0)  # y軸周りに回転
                glRotatef(dy, 1, 0, 0)  # x軸周りに回転
                rotation_start = event.pos

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)

    # 視点の移動範囲を制限
    max_zoom = 5.0
    min_zoom = -5.0
    zoom = max(min_zoom, min(max_zoom, zoom))
    glTranslatef(0.0, 0.0, -zoom)
    zoom = 0

    glBegin(GL_TRIANGLES)
    for face in faces:
        for vertex_i in face:
            glVertex3fv(vertices[vertex_i][:3])
    glEnd()

    pygame.display.flip()
    pygame.time.wait(10)