Python のまとめ
Python でできること,Python での書き方をすばやく確認できるページ.
【目次】
- Google Colaboratory でノートブックを開く
Google Colaboratory はオンラインの Python 開発環境
- Windows での Python のインストール
- Jupyter Qt Console, JupyterLab
- Python の隔離された環境 venv
- オブジェクトの生成と削除, 同値, 同一性
- 単純値のデータ型
- オブジェクトのタイプ(クラス名)の取得
- 文字列の演算子
- pandas データフレーム
- numpy 全般
- 1次元の配列
- 2次元の配列
- 2次元の配列の種々の処理
- numpy の npz 形式(numpy.ndarray)ファイルの書き出しと読み込み
- 2次元配列データのCSV ファイル読み書き
- メッシュグリッド
- 配列の次元を増やす
- リスト
- Pythonのモジュール
- Pythonのライブラリ
- Matplotlib を用いたプロット
- TensorFlow
- Keras
- ニューラルネットワークによる画像分類
- 制御構造(条件分岐,繰り返し)
- 式と変数
- 関数定義,関数オブジェクト
- 式の抽象化と関数
- 式の評価のタイミング
- クラス定義,オブジェクト生成,属性アクセス
- メソッド
- スーパークラスからの継承
【外部ページへのリンク(Python 関連)】
- 東京大学の「Pythonプログラミング入門」: https://utokyo-ipp.github.io/IPP_textbook.pdf
- ITmedia 社の「Python チートシート」の記事: https://atmarkit.itmedia.co.jp/ait/articles/2004/20/news015.html
- Python の公式サイト: https://www.python.org
【サイト内の関連ページ】
- Python とプログラミングの基本
別ページ »にまとめ
Google Colaboratory, Paiza.IO を使用
- Python 演習(コードコンバット (Code Combat を使用) [PDF], [パワーポイント]
- Python 入門(全6回)
Python 入門(全14回,Python Tutor と CodeCombat を使用): 別ページ »で説明
Google Colaboratory を使用.
- Python プログラミング演習(全9回)
Python 入門(全14回,Python Tutor と CodeCombat を使用): 別ページ »で説明
Python Tutor, VisuAlgo を使用.
- Windows での Python 処理系と開発環境のインストール
別ページ »で説明
- その他,
Python について: 別ページ »にまとめている.
Google Colaboratory でノートブックを開く
Google Colaboratory はオンラインの Python 開発環境. 使用するには Google アカウントが必要
- Google Colaboratory のWebページを開く
https://colab.research.google.com
- 「ファイル」で、「ノートブックを新規作成」を選ぶ
- Google アカウントでのログインが求められたときはログインする
- コードセルの中に Python プログラムを書き、「再生ボタン」をクリック
- コードセルを追加したいときは、「挿入」で、「コードセル」をクリック
Google Colaboratory で GPU の確認
!nvidia-smi --query-gpu=gpu_name,driver_version,memory.total --format=csv

Google Colaboratory を使用中であるかを判別する Python プログラム
try:
from google.colab import drive
USE_COLAB = True
except:
USE_COLAB = False
Google Colaboratory での実行結果


Windows での Python のインストール
Windows では,複数のバージョンの Python を同時にインストールすることは簡単である.そのときは,環境変数 Path の設定を常に意識すること.Python ランチャーである「py」コマンドも利用すること.
古いバージョンの Python のアンインストール
すでに,Python がインストール済みのとき.
ここで示すインストール手順とは異なる設定ですでに Python をインストールしていた場合は,それをそのまま使うよりも, アンインストールしておいたほうがトラブルが少ない可能性がある.
- Python をインストール済みであるかを確認.
- インストール済みのときは,Pythonをすべてアンインストールしてから,ここから先の操作を開始した方がトラブルが少ない.
- 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
Python 3.9 のインストール
【Python のインストールでの注意点】
- Python 64-bit 版を使用してください.
- Python をシステム領域にインストールすることを推奨する.
Windowsでは,Python をユーザ領域(既定の設定)またはシステム領域にインストールできる. しかし,ユーザー名に日本語が含まれている場合,Python をユーザ領域にインストールすると問題が発生する可能性がある.システム領域にインストールすることで,ファイルパスに日本語が含まれることを避けることができ,問題を防ぐことができる.
- TensorFlow 2.10.1 の利用
TensorFlow 2.10.1 は次のPythonのバージョンと互換性がある: Python 3.10, Python 3.9, Python 3.8, Python 3.7
この互換性情報は,https://pypi.org/project/tensorflow/2.10/#files で確認できる. 注意点として, TensorFlow 2.10.1 は, Python 3.6以前のバージョン,Python 3.11以降のバージョンではサポートされていない(2024/7時点). 最新の互換性情報は変更される可能性があるため,https://pypi.org/project/tensorflow/2.10/#files などの公式ドキュメントで再確認すること.
- Windows では, Python の 3.6.A,3.7.B, 3.8.C, 3.9.D, 3.10.E のように,複数のバージョンの 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 のインストール(あとのトラブルが起きにくいような手順を定めている)
- TensorFlow のインストール予定がある場合には, 次のページで,必要な Python のバージョンを確認
- Python の URL を開く
- Windows 版の Python 3.10 をダウンロード
ページの上の方にある「Downloads」をクリック. 「Downloads」の下にメニューが出るので,その中の「Windows」をクリック
- 「Stable Releases」から,Python のバージョンを選ぶ
ここでは,Python 3.10 系列の最新版を探して,選ぶ.
以下,Python 3.10.9 を選んだとして説明を続ける.他のバージョンでも以下の手順はほぼ同じである.
TensorFlow を使う予定がある場合は,https://pypi.org/project/tensorflow-gpu/#filesで,必要な Python のバージョンを確認しておく. 2024/5 時点では,TensorFlow バージョン 2.10 が動くのは,Python 3.10 または Python 3.9 または Python 3.8 または Python 3.7 (https://pypi.org/project/tensorflow/2.10/#files)
- ファイルの種類を選ぶ.
Windows の 64ビット版のインストーラをダウンロードしたいので、「Windows Installer (64-bit)」を選ぶ
- ダウンロードが始まる
- インストール時の設定
- いまダウンロードした .exe ファイルを右クリック,
右クリックメニューで「管理者として実行」を選ぶ.
-
Python ランチャーをインストールするために,「Install launcher for all users (recommended)」をチェック.
* すでに Python ランチャーをインストール済みのときは, 「Install launcher for all users (recommended)」がチェックできないようになっている場合がある.そのときは,チェックせずに進む.
- 「Add Python.exe to PATH」をチェック.
- 「Customize installation」をクリック.
- オプションの機能 (Optional Features)は,既定(デフォルト)のままでよい.
「Next」をクリック
- 「Install Python 3.10 for all users」を選ぶ.
「Install Python 3.10 for all users」を選ぶ理由.
ユーザ名が日本語のときのトラブルを防ぐため.
- そして,Python のインストールディレクトリは,「C:\Program Files\Python310」のように自動設定されることを確認.
- 「Install」をクリック
- インストールが始まる
- 「Disable path length limit」が表示される場合がある.クリックして、パス長の制限を解除する
表示されない場合は問題ない.そのまま続行.
- インストールが終了したら,「Close」をクリック
- いまダウンロードした .exe ファイルを右クリック,
右クリックメニューで「管理者として実行」を選ぶ.
- インストールのあと,Windows のスタートメニューに「Python 3.10」が増えていることを確認.
- システムの環境変数 Path の確認のため,新しくコマンドプロンプトを開き,次のコマンドを実行する.
py とpip にパスが通っていることの確認である.
where py where pip
where py では「C:\Windows\py.exe」 が表示され, where pip では「C:\Program Files\Python310\Scripts\pip.exe」 が表示されることを確認. (「310」のところは使用する Python のバージョンに読み替えること).
表示されないときは, システムの環境変数Pathに,C:\Program Files\Python310 と C:\Program Files\Python310\Scripts が追加済みであることを確認(「310」のところは使用する Python のバージョンに読み替えること).無ければ追加し,再度コマンドプロンプトを開いて,再度「where py」,「where pip」を実行して確認.
それでもうまく行かない場合は,いろいろ原因が考えられる.対処としては,Python のアンインストールを行う.過去,アンインストールがうまく行かなかった可能性を疑う(Python の Scripts の中のファイルで,アンインストール操作により削除されるべきファイルが残っている可能性があるなど)
(3) pip と setuptools の更新
- Windows で,コマンドプロンプトを管理者権限で起動する(例:Windowsキーを押し,「cmd」と入力し,「管理者として実行」を選択)
- 次のコマンドを実行する.
python -m pip install -U pip setuptools
Python に関しての情報取得
Python にトラブルがあった時に役に立つように,情報取得の手順をまとめている.
- Windows のシステム環境変数Path
インストール時に,「Add Python ... to PATH」をチェックしたので、 Python についての設定が自動で行われる.
- python のバージョンの確認
python --version
-
Python のビルドに用いられたコンパイラのバージョン番号の確認
python
下の実行例では、バージョン番号として「1929」が表示されている
- 次のPythonプログラムを実行し,バージョン番号を確認
下の実行例では,バージョン番号として「14.2」が表示されている.
from distutils.msvc9compiler import * get_build_version()
- exit() で終了
- pip の動作確認
Python のパッケージも同時にインストールされることが分かる.
* エラーメッセージが出ないことを確認.
pip list
Jupyter Qt Console, Jupyter ノートブック (Jupyter Notebook), JupyterLab
JupyterLab, Jupyter ノートブック (Jupyter Notebook), Jupyter Qt Console は Python プログラム作成に関する種々の機能を持ったソフトウェア
Python プログラムを動かして,結果をビジュアルに見たいときは, 開発環境や Python コンソール(Jupyter Qt Console, Spyder,PyCharm,PyScripter など)が便利.
Windows での Jupyter Qt Console, Jupyter ノートブック (Jupyter Notebook), JupyterLab の起動
Windows を使用する場合は,次のように操作する.
- Jupyter Qt Console の起動: 「jupyter qtconsole」または「python -m qtconsole」.
- Jupyter ノートブック (Jupyter Notebook) の起動: 「jupyter notebook」または「python -m notebook」
- JupyterLab の起動: 「jupyter lab」または「python -m jupyterlab」.
複数の Python バージョンを共存しているときは, Python ランチャーを使う. 次のようにバージョン指定する.
- JupyterLab の起動: 「py -<バージョン> -m jupyterlab」.
- Jupyter ノートブック (Jupyter Notebook) の起動: 「py -<バージョン> -m notebook」.
- Jupyter Qt Console の起動: 「py -<バージョン> -m qtconsole」.
Windows での Jupyter Qt Console, Jupyter ノートブック (Jupyter Notebook), JupyterLab のインストール
Jupyter Qt Console, Jupyter ノートブック (Jupyter Notebook), JupyterLab のインストールは, Windows でコマンドプロンプトを管理者として開き 次のコマンドを実行する.
次のコマンドを実行することにより,pipとsetuptoolsを更新する,Jupyter Notebook,PyQt5、Spyderなどの主要なPython環境がインストールされる.
python -m pip install -U pip setuptools requests notebook==6.5.7 jupyterlab jupyter jupyter-console jupytext PyQt5 nteract_on_jupyter spyder
Ubuntu での Jupyter Qt Console, JupyterLab の起動
- Jupyter Qt Console の起動: 「jupyter qtconsole」または「python3 -m qtconsole」.
- JupyterLab の起動: 「jupyter lab」または「python3 -m 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 の隔離された環境の新規作成,有効化,無効化を行う.
- 前もって Python をインストールしておく.使用している Python のバージョンの確認は,次のコマンドで行うことができる.
python --version
- Python の仮想環境の作成
ここでは,venv のためのディレクトリ名「%HOMEPATH%\.venv」を指定して,新しいPython の仮想環境を生成する.
python -m venv %HOMEPATH%\.venv dir /w %HOMEPATH%\.venv
- Python の隔離された環境の有効化
%HOMEPATH%\.venv\Scripts\activate.bat
- パッケージを確認してみる
python -m pip list
- 現在使用している Python の隔離された環境の使用中止(無効化)
deactivate
複数のバージョンの Python をインストールしているとき(Windows の場合)
複数のバージョンの Python をインストールしているときは, 「python」の代わりに, Python ランチャー の「py」を使うのが便利である.
- 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 の複数バージョンの同時インストールは,特別に設定を行うことなくできる.
- バージョン指定の中での「-32」や「-64」の省略
「py -X」のように,バージョン指定の中の「-32」,「-64」を省略することもできる. そのときは,Python バージョン X が実行されるが, Python のバージョン X 32ビット版と64ビット版をインストールしている場合は, 64ビット版の方が実行される. (公式マニュアルに,そのように記載されている)
- バージョン指定自体の省略
「py」のようにバージョン指定を省略したときは, インストールされている Python の最新バージョンが実行される. (公式マニュアルに,そのように記載されている)
- バージョン指定の中での「-32」や「-64」の省略
- 新しい Python の隔離された環境の生成
ここでは,venv のためのディレクトリ名「%HOMEPATH%\.venv」を指定して,新しいPython の仮想環境を生成する.
-3.9 は,使用したい Python のバージョンの指定である.
py -3.9 -m venv %HOMEPATH%\.venv dir /w %HOMEPATH%\.venv
- Python の隔離された環境の有効化
%HOMEPATH%\.venv\Scripts\activate.bat
- Python ランチャーの実行において,先ほど指定した Python のバージョンのものが実行されるように設定されている.そのことを確認.
- python コマンドでも,先ほど指定した Python のバージョンのものが実行されるように設定されている.そのことを確認.
python --version
- パッケージを確認してみる
python -m pip list
- 現在使用している Python の隔離された環境の使用中止(無効化)
deactivate
Python の仮想環境を扱う(venv を使用)(Ubuntu の場合)
venv を用いて,新しいPython の仮想環境の生成 Python の隔離された環境の新規作成,有効化,無効化を行う.
- python3-venv のインストール
sudo apt -y update sudo apt -y install python3-venv
- 使用している システム Python のバージョンの確認は,次のコマンドで行うことができる.
python3 --version
- Python の仮想環境の作成
ここでは,venv のためのディレクトリ名「~/.venv」を指定して,新しいPython の仮想環境を生成する.
*システム Python と違うバージョンの Python を使いたいときは, pyenv の利用が便利である.pyenv の詳細は,別ページ »で説明
* 「python3 -m venv」は,システム Python を用いての venv モジュールの実行
- Python の隔離された環境の有効化
source ~/.venv/bin/activate
- パッケージを確認してみる
python -m pip list
- 現在使用している Python の隔離された環境の使用中止(無効化)
deactivate
オブジェクトの生成と削除, 同値, 同一性
プログラミングでのオブジェクトは,コンピュータでの操作や処理の対象となるもののこと.
キーワード: =, del, ==, is
- 同値
a = 123 b = 123 print(a == b)
- 同一性
x = True y = None print(x is True) print(y is None)
- オブジェクトの生成と削除
c = 123 print(c) del a print(c)
単純値のデータ型
- キーワード: int, float, Decimal, True, False, bool, None, str, bytes,
list, range, tuple, dict, set
- int: 整数
- float: 浮動小数点数
- bool: ブール値
- str: 文字列
- bytes: バイト列
- 辞書 (dictionary)
dic = {} dic.update( {"kaneko": 30} ) print(dic)
- 名前付きタップル (named tuple)
import collections Point3d = collections.namedtuple('Point3d', 'x y z') p = Point3d(10, 20, 30) print(p)
オブジェクトのタイプ
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)) )

制御構造(条件分岐,繰り返し)
キーワード: if, elif, else, while, break, for
条件分岐
- 条件分岐
変数の値によって,実行の流れが変わる.
age = 15 if (age <= 12): print(500) else: print(1800)
- 多分岐
age = 15 if age <= 12: print(500) elif age <= 15: print(1000) else: print(1800)
繰り返し
- while による繰り返し
b = 8 s = 0 while s < 100: s = s + b print(s)
- for による繰り返し
for i in range(10): print(i)
月の日数についてのデータを作る.うるう年のことは考えないことにする
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] )

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 )

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)

「*」の表示を 18 回繰り返す(* を 18 個並べて表示)
for による繰り返し
import sys
for i in range(18):
sys.stdout.write("*")

文字列の演算子
キーワード: +, in, %, split, join, replace, strip, match, sprintf
pandas データフレーム
Pandas を用いたデータの扱い (CVSファイル読み込み、散布図、要約統計量、ヒストグラム)を示す.
説明のために,次のようなデータ(CSV ファイル)を使う.ファイル名は enquete.csv

このデータ(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が便利である.
- アンケートデータの読み込み
import pandas as pd import seaborn as sns x = pd.read_csv('C:/enquete.csv', encoding='SHIFT-JIS')
先頭行にデータ本体がある(先頭行が属性名でない)ときは、「pd.read_csv('hoge.csv',
)」のようにする - 読み込んだデータの表示
print(x)
- 読み込んだデータのうち、1列目と 2列目の表示
* オブジェクト x には 0列目と 1列目と 2列目がある.
print(x.iloc[:,1]) print(x.iloc[:,2])
- 読み込んだデータについて、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()
- 各列について、基本的な情報の表示
- head: 先頭部分の表示
- shape: サイズ
- ndim: 次元数
- columns: 属性名
- info(): 各属性のデータ型
print(x.head()) print(x.info()) print(x.shape) print(x.ndim) print(x.columns)
- CSV ファイルに書き出し
x.to_csv('hoge.csv', header=True, index=False, encoding='SHIFT-JIS')
- 読み込んだデータの表示
各属性の要約統計量(総数、平均、標準偏差、最小、四分位点、中央値、最大)
print(x.describe())

JSONファイルの書き出しと読み込み
import numpy as np
pd.to_json('hoge.json')
a = pd.read_json('hoge.json')
pandas.DataFrame のコンストラクタ
- リストから
pd.DataFrame([1, 2, 3])
- numpy.ndarray から
import numpy as np import pandas as pd pd.DataFrame( np.array([1,2,3]) )
import numpy as np import pandas as pd pd.DataFrame( np.array([[1,2,3], [10,20,30], [100,200,300]]) )
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()


2次元ヒストグラム
plt.hist2d(x.iloc[:,1], x.iloc[:,2])
plt.show()

numpy 全般
次元数
numpy の1次元の配列の次元数は 1.(ndimで得る)
1次元の配列の形は (<要素数>,)のように表示される(shapeで得る)
import numpy as np
x = np.zeros(10)
print( x.ndim )
print( x.shape )

numpy の2次元の配列の次元数は 2.(ndimで得る)
2次元の配列の形は ((<要素数>,<要素数>))のように表示される(shapeで得る)
import numpy as np
x = np.zeros((2, 3))
print( x.ndim )
print( x.shape )

データ型と,要素のデータ型
1次元の配列のデータ型は numpy.darray.(typeで得る)
配列の要素のデータ型は dtypes を使って表示… 「float64」は浮動小数点数
import numpy as np
x = np.zeros(10)
print( type( x ) )
print( x.dtype )

2次元の配列のデータ型は numpy.darray.(typeで得る)
配列の要素のデータ型は dtypes を使って表示… 「float64」は浮動小数点数
import numpy as np
x = np.zeros((2, 3))
print( type( x ) )
print( x.dtype )

1次元の配列
配列は,データの並びで,それぞれのデータに,0 から始まる番号(添字)が付いている.
1次元の配列の生成
- 0要素
type はオブジェクトのタイプの取得.shape は配列(アレイ)のサイズの取得.
import numpy as np x = np.zeros(10) print(x) print(type(x)) print(x.shape)
表示の「0.」は「0」のこと
- 1要素
import numpy as np x = np.ones(10) print(x) print(type(x)) print(x.shape)
表示の「1.」は「1」のこと
- 乱数. 正規分布.平均が0
import numpy as np x = np.random.randn(10) print(x) print(type(x)) print(x.shape)
- 要素指定(要素を並べて書いて配列を作る)
import numpy as np x = np.array([3, 1, 2, 5, 4]) print(x) print(type(x)) print(x.shape)
- arange による指定
-5 から開始して、2 ずつ増やし、4 まで
import numpy as np x = np.arange(-5, 4, 2) print(x) print(type(x)) print(x.shape)
- linespace による指定
-2 から、2 まで、全部で、9 個
import numpy as np x = np.linspace(-2, 2, 9) print(x) print(type(x)) print(x.shape)
合計
8, 6, 4, 3, 2 というデータについて,合計を求める
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)
表示の「0.」は「0」のこと

import numpy as np
x = np.ones((2, 3))
print(x)
print(type(x))
print(x.shape)
表示の「1.」は「1」のこと

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 を用いて行列の積を求める
時間計測も行う.
- CPU を用いて,行列の積を求める
!pip3 install cupy import numpy as np use_gpu=False if use_gpu: import cupy npcp = cupy else: npcp = np x = npcp.random.random((5000, 5000)) y = npcp.random.random((5000, 5000)) import datetime a = datetime.datetime.now() npcp.dot(x, y) print( (a - datetime.datetime.now()).microseconds )
- GPU を用いて,行列の積を求め
上のプログラムと同じ. 「use_gpu=False」を 「use_gpu=True」に変えただけ
!pip3 install cupy import numpy as np use_gpu=True if use_gpu: import cupy npcp = cupy else: npcp = np x = npcp.random.random((5000, 5000)) y = npcp.random.random((5000, 5000)) import datetime a = datetime.datetime.now() npcp.dot(x, y) print( (a - datetime.datetime.now()).microseconds )
行列の積,主成分分析,SVD,k-means
次のプログラムは,NumPy と scikit-learn を使用して,行列計算とデータ分析を行う.
- 2000x2000 の乱数行列 X と Y を生成し、それらの行列積を計算する.
- scikit-learn の PCA を使用して,X の主成分分析を行い,2次元に次元削減する.
- NumPy の svd 関数を使用して、X の特異値分解を行う.
- 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 ファイル読み込み.pandas の機能で行う. これは,いま作成したファイル XX.csv を読み込むもの.
pd.read_csv("XX.csv", header=None)

今度は,ファイル YY.csv を読み込む.
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)

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

Python のリストの添字は 0 から開始する
a = [10, 20, 30]
print(a[1])
a[2] = 200
print(a)

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

最大公約数
24 と 18 の最大公約数を求めたい.結果 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 の正方形の一辺の長さは?
次のプログラムを実行.結果 2.6457513110645907 を確認(結果は近似値)
import math
print( math.sqrt(7) )

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

三角形の面積
三角形の2辺の長さが,4と6で,その間の角度が60度のとき.
import math
print( (1/2) * 4 * 6 * math.sin(60 * math.pi / 180) )

IPython.display を用いた画像表示
画像ファイルを読み込んで表示
from PIL import Image
Image.open("126.png").show()

Matplotlib を用いたプロット
matplotlib は,オープンソースの Python のプロットライブラリ.
散布図
- x, y からの散布図の作成
%matplotlib inline import matplotlib.pyplot as plt import warnings warnings.filterwarnings('ignore') # Suppress Matplotlib warnings import numpy as n x = [1, 2, 3, 4, 5] y = [2, 4, 1, 3, 5] plt.style.use('ggplot') plt.scatter(x, y)
- pandas の 2つの属性 x, y からの散布図の作成
import numpy as np import pandas as pd %matplotlib inline import matplotlib.pyplot as plt import warnings warnings.filterwarnings('ignore') # Suppress Matplotlib warnings a = pd.DataFrame( {'x' : [1, 2, 3, 4, 5], 'y' : [2, 4, 1, 3, 5]} ) plt.style.use('ggplot') plt.plot(a['x'], a['y'], 'ro') plt.show()
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')

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 画像の表示するときに,小さく表示される場合
普通に Matplotlib を用いてOpenCV 画像の表示を表示すると,小さく表示される.
「plt.style.use('default') 」の実行により,Matplotlib での OpenCV 画像の表示が大きくなる.

関数のプロット
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))

メッシュグリッドと関数の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')

メッシュグリッドと関数の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')

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

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

Keras
Keras は,TensorFlow を用いてのディープラーニング(深層学習)でのモデルの構築と,その訓練(構築)を簡単に行えるようにするソフトウェア
用語集
- Keras のモデルは,複数の層が組み合わさったもの.単純に層を積み重ねたもの(シーケンシャル)や,複雑な構成のもの(グラフ)がある
- Keras の層には,活性化関数,層の重みの種類(カーネル,バイアスなど)を設定できる
- Keras の層には,全結合,畳み込み(コンボリューション)などの種類がある
- 学習のために,オプティマイザの設定を行う
- Keras のモデルの構成やオプティマイザの設定は,保存できる
- 学習の結果は,結合の重みになる.結合の重みも保存できる
ニューラルネットワークのデモサイト: http://playground.tensorflow.org
手順
-
パッケージのインポートなど
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__)
- 画像データセット 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"]
- 画像データセット 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()
- 「サイズ 28 × 28 の 60000枚の濃淡画像」であることを確認
配列の形: 60000×28×28
次元: 3
「+ コード」で,コードセルを追加し,次を実行.
print( x_train.shape ) print( x_train.ndim )
- ディープニューラルネットワークのモデルの作成
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'])
- ニューラルネットワークの確認表示
「+ コード」で,コードセルを追加し,次を実行.
print(m.summary())
- ニューラルネットワークの学習を行う
「+ コード」で,コードセルを追加し,次を実行.
history = m.fit(x_train, y_train, epochs=50)
- 検証用データで検証する
「+ コード」で,コードセルを追加し,次を実行.
print( m.evaluate(x_test, y_test, verbose=2) )
* 訓練(学習)などで乱数が使われるので,下図と違う値になる.
- ニューラルネットワークを使ってみる
テスト画像を,ニューラルネットワークに与えて,予測させる
テスト画像は 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個の数字が得られている.
* 訓練(学習)などで乱数が使われるので,下図と違う値になる.
- 正解表示
テスト画像 0 番の正解を表示
「+ コード」で,コードセルを追加し,次を実行.
print(y_test[0])
* 訓練(学習)などで乱数が使われるので,下図と違う値になる.
ニューラルネットワークによる画像分類
- このページでは、次の画像を使うことにする
2071.png のようなファイル名で保存しておく
- 画像のアップロード操作
- ファイルをアップロードしたい.「ファイル」を選ぶ
- 「アップロード」を選ぶ
- アップロードしたいファイルを選ぶ
- ファイルをアップロードしたい.「ファイル」を選ぶ
- 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)と,それぞれの 確率が表示される.
式と変数
変数は,変化するデータのこと. 「x = 100」のように書くと x の値が 100 に変化する
式の実行結果として値が得られる.式の中に,変数名を書くことができる.
x = 100
y = 200
print(x + y)
print( (x + 10) * y)

teihen = 2.5
takasa = 5
print(teihen * takasa / 2)

関数定義,関数オブジェクト
関数定義は def, 帰り値は return
- アッカーマン関数の定義
def a(m, n): if m == 0: return n + 1 elif n == 0: return a(m-1, 1) else: return a(m-1, a(m, n-1)) print(a(3, 2)) print(a(m = 3, n = 2)) print(a(n = 2, m = 3))
- 既定(デフォルト)値
def a(m, n = 1): if m == 0: return n + 1 elif n == 0: return a(m-1, 1) else: return a(m-1, a(m, n-1)) print(a(3, 1)) print(a(3)) print(a(m = 3))
- 関数オブジェクト
f = lambda x: x + 1 print(f(100))
式の抽象化と関数
式の抽象化は,類似した複数の式(下に書いた3つの式のようなもの)を, 変数を使って1つにまとめること.
print(100 * 1.08)
print(150 * 1.08)
print(400 * 1.08)

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

式の評価のタイミング
関数の中の式の評価では, 最新の変数値が用いられる
x = 30
def foo(a):
return(a * x)
x = 300
print(foo(100))
x = 3000
print(foo(100))

クラス定義,オブジェクト生成,属性アクセス
- メソッド: オブジェクトに属する操作や処理
- クラス: 同一種類のオブジェクトの集まり
- クラス定義: あるクラスが持つ属性とメソッドを定めること.
- 「.」+属性名: 属性アクセス
メソッド内では,self + 「.」で,属性にアクセスする
クラス定義,オブジェクト生成,属性アクセスの例
クラス名: 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」は属性アクセスである.

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 はオブジェクトと,属性名(文字列)を指定して,値を取得する.

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 では,オブジェクトと,属性名(文字列)と値を指定する.

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

メソッド
メソッドの例
- 「.」+メソッド名: メソッドアクセス
メソッド内では,self + 「.」で,属性やメソッドにアクセスする
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 は,メソッドの説明を表示する.

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