├── .gitignore ├── README.md ├── .DS_Store ├── pdfs ├── python-fig1.pdf └── python-fig2.pdf ├── images ├── python-fig1.png └── python-fig2.png └── notebooks ├── exams ├── 14-numpy2-exam.ipynb ├── 11-python1-exam.ipynb ├── 13-numpy1-exam.ipynb ├── 12-python2-exam.ipynb └── 15-matplotlib-exam.ipynb ├── 10-my-first-notebook.ipynb ├── 14-numpy2.ipynb ├── 12-python2.ipynb ├── 11-python1.ipynb ├── 13-numpy1.ipynb └── 15-matplotlib.ipynb /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | 3 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 京都情報大学院大学 数学コース 2 | コンテンツ配布用 3 | 4 | 5 | -------------------------------------------------------------------------------- /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/makaishi2/kcgi-course-contents/master/.DS_Store -------------------------------------------------------------------------------- /pdfs/python-fig1.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/makaishi2/kcgi-course-contents/master/pdfs/python-fig1.pdf -------------------------------------------------------------------------------- /pdfs/python-fig2.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/makaishi2/kcgi-course-contents/master/pdfs/python-fig2.pdf -------------------------------------------------------------------------------- /images/python-fig1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/makaishi2/kcgi-course-contents/master/images/python-fig1.png -------------------------------------------------------------------------------- /images/python-fig2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/makaishi2/kcgi-course-contents/master/images/python-fig2.png -------------------------------------------------------------------------------- /notebooks/exams/14-numpy2-exam.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "## Numpy2 課題" 8 | ] 9 | }, 10 | { 11 | "cell_type": "markdown", 12 | "metadata": {}, 13 | "source": [ 14 | "重回帰用の学習データx2に更に、項目'CRIM'と'ZN'を追加したデータx4を作って下さい。" 15 | ] 16 | }, 17 | { 18 | "cell_type": "code", 19 | "execution_count": 1, 20 | "metadata": {}, 21 | "outputs": [], 22 | "source": [ 23 | "# 必要ライブラリimport\n", 24 | "import numpy as np\n", 25 | "from sklearn.datasets import load_boston\n", 26 | "\n", 27 | "boston = load_boston()\n", 28 | "x_org, yt = boston.data, boston.target\n", 29 | "feature_names = boston.feature_names\n", 30 | "\n", 31 | "x_data = x_org[:,feature_names == 'RM']\n", 32 | "x = np.insert(x_data, 0, 1.0, axis=1)\n", 33 | "\n", 34 | "x_add = x_org[:,feature_names == 'LSTAT']\n", 35 | "x2 = np.hstack((x, x_add))" 36 | ] 37 | }, 38 | { 39 | "cell_type": "code", 40 | "execution_count": 2, 41 | "metadata": {}, 42 | "outputs": [ 43 | { 44 | "name": "stdout", 45 | "output_type": "stream", 46 | "text": [ 47 | "(506, 3)\n", 48 | "[[1. 6.575 4.98 ]\n", 49 | " [1. 6.421 9.14 ]\n", 50 | " [1. 7.185 4.03 ]\n", 51 | " [1. 6.998 2.94 ]\n", 52 | " [1. 7.147 5.33 ]]\n" 53 | ] 54 | } 55 | ], 56 | "source": [ 57 | "print(x2.shape)\n", 58 | "print(x2[:5,:])" 59 | ] 60 | }, 61 | { 62 | "cell_type": "code", 63 | "execution_count": null, 64 | "metadata": {}, 65 | "outputs": [], 66 | "source": [ 67 | "# ここから先にx4作成用のコードを書いて下さい\n" 68 | ] 69 | } 70 | ], 71 | "metadata": { 72 | "kernelspec": { 73 | "display_name": "Python 3", 74 | "language": "python", 75 | "name": "python3" 76 | }, 77 | "language_info": { 78 | "codemirror_mode": { 79 | "name": "ipython", 80 | "version": 3 81 | }, 82 | "file_extension": ".py", 83 | "mimetype": "text/x-python", 84 | "name": "python", 85 | "nbconvert_exporter": "python", 86 | "pygments_lexer": "ipython3", 87 | "version": "3.7.3" 88 | } 89 | }, 90 | "nbformat": 4, 91 | "nbformat_minor": 2 92 | } 93 | -------------------------------------------------------------------------------- /notebooks/exams/11-python1-exam.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Python入門1 課題" 8 | ] 9 | }, 10 | { 11 | "cell_type": "markdown", 12 | "metadata": {}, 13 | "source": [ 14 | "#### 問題1 \n", 15 | "次のlist1を元に、[14, 12, 10]という配列を作って下さい。\n" 16 | ] 17 | }, 18 | { 19 | "cell_type": "code", 20 | "execution_count": 3, 21 | "metadata": {}, 22 | "outputs": [], 23 | "source": [ 24 | "# リストの定義\n", 25 | "\n", 26 | "list1 = [2, 4, 6, 8, 10, 12, 14]" 27 | ] 28 | }, 29 | { 30 | "cell_type": "code", 31 | "execution_count": 6, 32 | "metadata": {}, 33 | "outputs": [ 34 | { 35 | "name": "stdout", 36 | "output_type": "stream", 37 | "text": [ 38 | "[14, 12, 10]\n" 39 | ] 40 | } 41 | ], 42 | "source": [ 43 | "# 解答\n", 44 | "\n", 45 | "list2 = list1[]\n", 46 | "print(list2)" 47 | ] 48 | }, 49 | { 50 | "cell_type": "markdown", 51 | "metadata": {}, 52 | "source": [ 53 | "#### 問題2 \n", 54 | "2次元のタプルは``(0,1)``、3次元のタプルは``(0,1,2)``のように表現しますが、 \n", 55 | "1次元のタプルは``(0)``ではなく``(0,)``と後ろにカンマをつけて表現します。\n", 56 | "その理由を簡単に説明して下さい。\n" 57 | ] 58 | }, 59 | { 60 | "cell_type": "code", 61 | "execution_count": null, 62 | "metadata": {}, 63 | "outputs": [], 64 | "source": [] 65 | }, 66 | { 67 | "cell_type": "code", 68 | "execution_count": null, 69 | "metadata": {}, 70 | "outputs": [], 71 | "source": [] 72 | }, 73 | { 74 | "cell_type": "code", 75 | "execution_count": null, 76 | "metadata": {}, 77 | "outputs": [], 78 | "source": [] 79 | } 80 | ], 81 | "metadata": { 82 | "kernelspec": { 83 | "display_name": "Python 3", 84 | "language": "python", 85 | "name": "python3" 86 | }, 87 | "language_info": { 88 | "codemirror_mode": { 89 | "name": "ipython", 90 | "version": 3 91 | }, 92 | "file_extension": ".py", 93 | "mimetype": "text/x-python", 94 | "name": "python", 95 | "nbconvert_exporter": "python", 96 | "pygments_lexer": "ipython3", 97 | "version": "3.7.3" 98 | } 99 | }, 100 | "nbformat": 4, 101 | "nbformat_minor": 2 102 | } 103 | -------------------------------------------------------------------------------- /notebooks/exams/13-numpy1-exam.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "## Numpy入門 課題" 8 | ] 9 | }, 10 | { 11 | "cell_type": "markdown", 12 | "metadata": {}, 13 | "source": [ 14 | "#### 問題1\n", 15 | "一次元配列のshapeの結果は``(3,)``のように後ろにカンマが付いた形で返ってきます。 \n", 16 | "なぜ``(3)``のような形にならないのか説明して下さい。\n", 17 | "(前回の課題の復習です)\n" 18 | ] 19 | }, 20 | { 21 | "cell_type": "code", 22 | "execution_count": 2, 23 | "metadata": {}, 24 | "outputs": [ 25 | { 26 | "name": "stdout", 27 | "output_type": "stream", 28 | "text": [ 29 | "(3,)\n", 30 | "(2, 3)\n" 31 | ] 32 | } 33 | ], 34 | "source": [ 35 | "# (例)\n", 36 | "import numpy as np\n", 37 | "\n", 38 | "v = np.array([1,2,3])\n", 39 | "print(v.shape)\n", 40 | "\n", 41 | "M = np.array([[1,2,3],[4,5,6]])\n", 42 | "print(M.shape)" 43 | ] 44 | }, 45 | { 46 | "cell_type": "code", 47 | "execution_count": null, 48 | "metadata": {}, 49 | "outputs": [], 50 | "source": [ 51 | "# 解答1\n", 52 | "#\n", 53 | "#\n", 54 | "#\n", 55 | "#" 56 | ] 57 | }, 58 | { 59 | "cell_type": "markdown", 60 | "metadata": {}, 61 | "source": [ 62 | "#### 問題2\n", 63 | "\n", 64 | "np.random.randn関数と、スカラー和、スカラー積の仕組みを利用して \n", 65 | "平均4、標準偏差2の乱数を要素をして持つ 2x3 の行列Nを作って下さい。 \n", 66 | "\n", 67 | "(ヒント)平均0、標準偏差1の乱数を2倍して4を足すと、上記の乱数になります。" 68 | ] 69 | }, 70 | { 71 | "cell_type": "code", 72 | "execution_count": 3, 73 | "metadata": {}, 74 | "outputs": [ 75 | { 76 | "name": "stdout", 77 | "output_type": "stream", 78 | "text": [ 79 | "[[4.51744641 4.49728235 4.51347257]\n", 80 | " [4.76739818 5.15286872 5.88631157]]\n" 81 | ] 82 | } 83 | ], 84 | "source": [ 85 | "# 解答2\n", 86 | "\n", 87 | "Z = np.random.rand(2,3)\n", 88 | "N = \n", 89 | "\n", 90 | "print(N)" 91 | ] 92 | }, 93 | { 94 | "cell_type": "code", 95 | "execution_count": null, 96 | "metadata": {}, 97 | "outputs": [], 98 | "source": [] 99 | } 100 | ], 101 | "metadata": { 102 | "kernelspec": { 103 | "display_name": "Python 3", 104 | "language": "python", 105 | "name": "python3" 106 | }, 107 | "language_info": { 108 | "codemirror_mode": { 109 | "name": "ipython", 110 | "version": 3 111 | }, 112 | "file_extension": ".py", 113 | "mimetype": "text/x-python", 114 | "name": "python", 115 | "nbconvert_exporter": "python", 116 | "pygments_lexer": "ipython3", 117 | "version": "3.7.3" 118 | } 119 | }, 120 | "nbformat": 4, 121 | "nbformat_minor": 2 122 | } 123 | -------------------------------------------------------------------------------- /notebooks/exams/12-python2-exam.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Python入門2 課題" 8 | ] 9 | }, 10 | { 11 | "cell_type": "markdown", 12 | "metadata": {}, 13 | "source": [ 14 | "\n", 15 | "次のような数値リストをrange関数を使って作ってください\n", 16 | "" 17 | ] 18 | }, 19 | { 20 | "cell_type": "markdown", 21 | "metadata": {}, 22 | "source": [ 23 | "#### 問題1 \n", 24 | "```\n", 25 | "list1 = [10, 20, 30, .., 100] \n", 26 | "```" 27 | ] 28 | }, 29 | { 30 | "cell_type": "code", 31 | "execution_count": null, 32 | "metadata": {}, 33 | "outputs": [], 34 | "source": [ 35 | "# 解答1\n", 36 | "\n", 37 | "# 次のrange関数の引数をコーディングします。\n", 38 | "list1 = range()\n", 39 | "\n", 40 | "# 結果確認\n", 41 | "print(list(list1))" 42 | ] 43 | }, 44 | { 45 | "cell_type": "markdown", 46 | "metadata": {}, 47 | "source": [ 48 | "#### 問題2 \n", 49 | "\n", 50 | "```\n", 51 | "list2 = [20, 19, 18.., 1] \n", 52 | "```" 53 | ] 54 | }, 55 | { 56 | "cell_type": "code", 57 | "execution_count": null, 58 | "metadata": {}, 59 | "outputs": [], 60 | "source": [ 61 | "# 解答2\n", 62 | "\n", 63 | "# 次のrange関数の引数をコーディングします。\n", 64 | "list2 = range()\n", 65 | "\n", 66 | "# 結果確認\n", 67 | "print(list(list2))" 68 | ] 69 | }, 70 | { 71 | "cell_type": "markdown", 72 | "metadata": {}, 73 | "source": [ 74 | "#### 問題3\n", 75 | "\n", 76 | "\n", 77 | "ネストのかかったif構文の実装\n", 78 | "\n", 79 | "\n", 80 | "二次元変数x[0], x[1] があり、それぞれTrueかFalseの値を取るものとします。 \n", 81 | "次のような条件でprint文を出力するプログラムを組んでください。 \n", 82 | "\n", 83 | "次のような条件でprint文を出力するプログラムを組んでください。 \n", 84 | "(注) 条件をandでつないで一気に書くやりかたもありますが、 \n", 85 | "今回は練習のためネストのかかった2段階のif文でコーディングしてください。\n", 86 | "\n", 87 | "x[0]==True, x[1]==True -> very good \n", 88 | "x[0]==True, x[1]==False -> good \n", 89 | "x[0]==False, x[1]==True -> bad \n", 90 | "x[0]==False, x[1]==False -> very bad " 91 | ] 92 | }, 93 | { 94 | "cell_type": "code", 95 | "execution_count": null, 96 | "metadata": {}, 97 | "outputs": [], 98 | "source": [ 99 | "# 解答3 (以下の4つの条件それぞれでテストしてみます)\n", 100 | "\n", 101 | "x = [True, True]\n", 102 | "#x = [True, False]\n", 103 | "#x = [False, True]\n", 104 | "#x = [False, False]\n", 105 | "\n", 106 | "if # 以下にif文のコーディングをして下さい\n", 107 | "\n" 108 | ] 109 | }, 110 | { 111 | "cell_type": "markdown", 112 | "metadata": {}, 113 | "source": [ 114 | "#### 問題4\n", 115 | "\n", 116 | "リスト内包表記の実装\n", 117 | "\n", 118 | "\n", 119 | "``q_list = [0, 1, 2, 3, 4, 5, 6, 7]``\n", 120 | "というlist変数を元に次のlist変数を作って下さい。\n", 121 | "\n", 122 | "``list4 = [0, 1, 4, 9, 16, 25, 36, 49]``\n", 123 | "\n", 124 | "ヒント $x^2$はPythonでは ``x**2`` で表します。 " 125 | ] 126 | }, 127 | { 128 | "cell_type": "code", 129 | "execution_count": null, 130 | "metadata": {}, 131 | "outputs": [], 132 | "source": [ 133 | "# 解答4\n", 134 | "\n", 135 | "# 次の行でリスト内包表記を行います\n", 136 | "list4 = []\n", 137 | "\n", 138 | "# 結果の確認\n", 139 | "print(list4)" 140 | ] 141 | }, 142 | { 143 | "cell_type": "markdown", 144 | "metadata": {}, 145 | "source": [ 146 | "#### 問題5\n", 147 | "問題4同様に q_list を元に、\n", 148 | "``list5 = [0, 4, 16, 36]``\n", 149 | "というlist変数を作って下さい。\n", 150 | "\n", 151 | "ヒント 「x を y で割った余り」はPythonでは ``x%y`` で表します。\n" 152 | ] 153 | }, 154 | { 155 | "cell_type": "code", 156 | "execution_count": null, 157 | "metadata": {}, 158 | "outputs": [], 159 | "source": [ 160 | "# 解答5\n", 161 | "\n", 162 | "# 次の行でリスト内包表記を行います\n", 163 | "list5 = []\n", 164 | "\n", 165 | "# 結果の確認\n", 166 | "print(list5)" 167 | ] 168 | }, 169 | { 170 | "cell_type": "code", 171 | "execution_count": null, 172 | "metadata": {}, 173 | "outputs": [], 174 | "source": [] 175 | } 176 | ], 177 | "metadata": { 178 | "kernelspec": { 179 | "display_name": "Python 3", 180 | "language": "python", 181 | "name": "python3" 182 | }, 183 | "language_info": { 184 | "codemirror_mode": { 185 | "name": "ipython", 186 | "version": 3 187 | }, 188 | "file_extension": ".py", 189 | "mimetype": "text/x-python", 190 | "name": "python", 191 | "nbconvert_exporter": "python", 192 | "pygments_lexer": "ipython3", 193 | "version": "3.7.3" 194 | } 195 | }, 196 | "nbformat": 4, 197 | "nbformat_minor": 2 198 | } 199 | -------------------------------------------------------------------------------- /notebooks/10-my-first-notebook.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": { 6 | "collapsed": true 7 | }, 8 | "source": [ 9 | "# Jupyter Notebookの操作方法\n", 10 | "\n", 11 | "左側に``In [ ]``と表示されている領域のことを「セル」といいます。 \n", 12 | "Jupyter Notebookによる操作の原理は次のとおりです。\n", 13 | "\n", 14 | "* プログラム実行は**「セル」**の単位で行います。\n", 15 | "\n", 16 | "\n", 17 | "* 実行する場合は、実行対象のセルを選択した状態で**「Run」アイコン**のクリック、または**[Shift] + [Enter]**入力を行います。\n", 18 | "\n", 19 | "\n", 20 | "* 実行結果はカーネル上に記憶されています。別のセルから**計算結果を保存した変数**や、**定義した関数**が参照できるということです。\n", 21 | "\n", 22 | "\n", 23 | "* 実行結果が画面表示を含むものであった場合(グラフを含む)、結果は**実行したセルの直下**に表示されます。\n", 24 | "\n", 25 | "\n", 26 | "* Notebookファイルを保存する場合、**実行結果も含めた形**で保存されます。 \n", 27 | "外部ファイルとして保存するための手順はメニューから**「File」->「Download as」->「Notebook (.ipynb)」**です。\n", 28 | "\n", 29 | "\n", 30 | "* 過去の実行結果をご破算にしたい場合は、**「カーネル再起動」**を行います。 \n", 31 | "メニューから実行する場合は**「Kernel」-> 「Restart」**を選択します。\n", 32 | "\n", 33 | "\n", 34 | "* カーネルがクリアされても画面上の実行結果は残っています。 \n", 35 | "画面上の実行結果を含めてご破算にしたい場合は、**「Kernel」->「Restart & Clear Output」**を選択します。\n" 36 | ] 37 | }, 38 | { 39 | "cell_type": "markdown", 40 | "metadata": {}, 41 | "source": [ 42 | "### 最初の課題 (新規セルから実行)\n", 43 | "\n", 44 | "次のセルに ``1+1``を入力し、**「Run」アイコン**クリックまたは**[Shift]+[Enter]**でセルの実行を行って下さい。" 45 | ] 46 | }, 47 | { 48 | "cell_type": "code", 49 | "execution_count": null, 50 | "metadata": {}, 51 | "outputs": [], 52 | "source": [] 53 | }, 54 | { 55 | "cell_type": "markdown", 56 | "metadata": {}, 57 | "source": [ 58 | "既存のノートブックに新規セルを挿入したい場合、画面上部の「+」アイコンをクリックするか、\n", 59 | "メニューから**「Insert」->「Insert Cell Above**」または**「Inser Cell Below」**を選択します。" 60 | ] 61 | }, 62 | { 63 | "cell_type": "markdown", 64 | "metadata": {}, 65 | "source": [ 66 | "## 事前定義のプログラムの実行\n", 67 | "\n", 68 | "Notebokから読み込んだ時点でセルに入力済みのプログラムがPythonとして有効なものであった場合、 \n", 69 | "そのセルを選択した状態で「セルの実行」を行うことで、事前に定義してあるPythonプログラムを簡単に動かすことができます。\n", 70 | "\n" 71 | ] 72 | }, 73 | { 74 | "cell_type": "markdown", 75 | "metadata": {}, 76 | "source": [ 77 | "### 2番目の課題 (既存セルから実行)\n", 78 | "\n", 79 | "次のPythonコード事前定義済みセルを選択した状態で、**「Run」**アイコンクリックまたは**[Shift]+[Enter]**でセルの実行を行って下さい。 \n", 80 | "(参考のため解説をコメントとして書いておきましたが、現段階でコードの意味はわからなくていいです。操作方法のみ理解するようにして下さい。)" 81 | ] 82 | }, 83 | { 84 | "cell_type": "code", 85 | "execution_count": null, 86 | "metadata": {}, 87 | "outputs": [], 88 | "source": [ 89 | "# f(x, y)= x^2 + y^2のグラフの3次元表示 \n", 90 | "\n", 91 | "# グラフ表示のために必要な宣言\n", 92 | "%matplotlib inline\n", 93 | "\n", 94 | "# 必要ライブラリのインポート\n", 95 | "import numpy as np\n", 96 | "import matplotlib.pyplot as plt\n", 97 | "from mpl_toolkits.mplot3d import Axes3D \n", 98 | "from matplotlib import cm\n", 99 | "\n", 100 | "# 関数定義\n", 101 | "def func(x,y):\n", 102 | " return x**2 + y**2\n", 103 | "\n", 104 | "# x, yの座標値計算\n", 105 | "x = np.arange(-5,5,0.05)\n", 106 | "y = np.arange(-5,5,0.05)\n", 107 | "\n", 108 | "# 座標値を元にメッシュ状に(x, y)の値を生成\n", 109 | "X, Y = np.meshgrid(x,y)\n", 110 | "\n", 111 | "# (x, y)の値に対して関数値の計算\n", 112 | "Z = func(X,Y)\n", 113 | "\n", 114 | "# グラフ機能の呼出し\n", 115 | "fig = plt.figure()\n", 116 | "\n", 117 | "# 3次元グラフの宣言\n", 118 | "ax = Axes3D(fig)\n", 119 | "\n", 120 | "# 関数の三次元グラフ描画\n", 121 | "ax.plot_surface(X,Y,Z,cmap=cm.coolwarm) \n", 122 | "\n", 123 | "# グラフの画面表示\n", 124 | "plt.show()" 125 | ] 126 | }, 127 | { 128 | "cell_type": "markdown", 129 | "metadata": {}, 130 | "source": [ 131 | "### 3番目の課題 (カーネル再起動の確認)\n", 132 | "\n", 133 | "**3-A**: 次のセルに\n", 134 | "\n", 135 | "```\n", 136 | "print(func(2, 1))\n", 137 | "```\n", 138 | "\n", 139 | "のコマンドを入力し、実行して下さい。\n", 140 | "\n", 141 | "**3-B**: 上のガイドに従い「カーネル再起動」を行い、その後で``print(func(2, 1))``のセルを再度実行して下さい。\n", 142 | " \n", 143 | "**3-C**: グラフ描画のセルを実行した後でもう一度``print(func(2, 1))``を実行して下さい。 " 144 | ] 145 | }, 146 | { 147 | "cell_type": "markdown", 148 | "metadata": {}, 149 | "source": [ 150 | "(解説)\n", 151 | "3-Aの段階でfunc(2, 1)が計算できたのは、グラフ描画を行うセルの中にこの関数の定義が含まれていたからです。 \n", 152 | "「カーネル再起動」を行うことで、この定義もクリアされました。それで3-Bの段階では同じ関数呼び出しがエラーになりました。" 153 | ] 154 | }, 155 | { 156 | "cell_type": "markdown", 157 | "metadata": {}, 158 | "source": [ 159 | "### 4番目の課題 (Notebookファイルの保存)\n", 160 | "\n", 161 | "今までの実行結果を外部ファイルとして保存し、保存結果を提出して下さい。" 162 | ] 163 | }, 164 | { 165 | "cell_type": "code", 166 | "execution_count": null, 167 | "metadata": {}, 168 | "outputs": [], 169 | "source": [] 170 | } 171 | ], 172 | "metadata": { 173 | "kernelspec": { 174 | "display_name": "Python 3", 175 | "language": "python", 176 | "name": "python3" 177 | }, 178 | "language_info": { 179 | "codemirror_mode": { 180 | "name": "ipython", 181 | "version": 3 182 | }, 183 | "file_extension": ".py", 184 | "mimetype": "text/x-python", 185 | "name": "python", 186 | "nbconvert_exporter": "python", 187 | "pygments_lexer": "ipython3", 188 | "version": "3.7.3" 189 | } 190 | }, 191 | "nbformat": 4, 192 | "nbformat_minor": 1 193 | } 194 | -------------------------------------------------------------------------------- /notebooks/14-numpy2.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "## Numpy入門2\n", 8 | "7章の単回帰モデル実習での、学習データ準備の過程を詳しく説明しました。 \n", 9 | "(この解説は書籍には含まれていません)" 10 | ] 11 | }, 12 | { 13 | "cell_type": "code", 14 | "execution_count": 1, 15 | "metadata": {}, 16 | "outputs": [], 17 | "source": [ 18 | "# 必要ライブラリimport\n", 19 | "import numpy as np\n", 20 | "from sklearn.datasets import load_boston" 21 | ] 22 | }, 23 | { 24 | "cell_type": "code", 25 | "execution_count": 2, 26 | "metadata": {}, 27 | "outputs": [], 28 | "source": [ 29 | "# 学習用データの読み込み\n", 30 | "# Boston Dataセットというよく使われるデータなので、関数を呼び出すと自動的にダウンロードされます\n", 31 | "\n", 32 | "boston = load_boston()\n", 33 | "x_org, yt = boston.data, boston.target\n", 34 | "feature_names = boston.feature_names" 35 | ] 36 | }, 37 | { 38 | "cell_type": "code", 39 | "execution_count": 3, 40 | "metadata": {}, 41 | "outputs": [ 42 | { 43 | "name": "stdout", 44 | "output_type": "stream", 45 | "text": [ 46 | "[24. 21.6 34.7 33.4 36.2]\n" 47 | ] 48 | } 49 | ], 50 | "source": [ 51 | "# 正解データ ytの表示(一部)\n", 52 | "\n", 53 | "print(yt[:5])" 54 | ] 55 | }, 56 | { 57 | "cell_type": "code", 58 | "execution_count": 4, 59 | "metadata": {}, 60 | "outputs": [ 61 | { 62 | "name": "stdout", 63 | "output_type": "stream", 64 | "text": [ 65 | "クラス名: \n", 66 | "サイズ: (506, 13)\n", 67 | "内容表示(一部):\n", 68 | "[[6.3200e-03 1.8000e+01 2.3100e+00 0.0000e+00 5.3800e-01 6.5750e+00\n", 69 | " 6.5200e+01 4.0900e+00 1.0000e+00 2.9600e+02 1.5300e+01 3.9690e+02\n", 70 | " 4.9800e+00]\n", 71 | " [2.7310e-02 0.0000e+00 7.0700e+00 0.0000e+00 4.6900e-01 6.4210e+00\n", 72 | " 7.8900e+01 4.9671e+00 2.0000e+00 2.4200e+02 1.7800e+01 3.9690e+02\n", 73 | " 9.1400e+00]\n", 74 | " [2.7290e-02 0.0000e+00 7.0700e+00 0.0000e+00 4.6900e-01 7.1850e+00\n", 75 | " 6.1100e+01 4.9671e+00 2.0000e+00 2.4200e+02 1.7800e+01 3.9283e+02\n", 76 | " 4.0300e+00]\n", 77 | " [3.2370e-02 0.0000e+00 2.1800e+00 0.0000e+00 4.5800e-01 6.9980e+00\n", 78 | " 4.5800e+01 6.0622e+00 3.0000e+00 2.2200e+02 1.8700e+01 3.9463e+02\n", 79 | " 2.9400e+00]\n", 80 | " [6.9050e-02 0.0000e+00 2.1800e+00 0.0000e+00 4.5800e-01 7.1470e+00\n", 81 | " 5.4200e+01 6.0622e+00 3.0000e+00 2.2200e+02 1.8700e+01 3.9690e+02\n", 82 | " 5.3300e+00]]\n", 83 | "項目名: ['CRIM' 'ZN' 'INDUS' 'CHAS' 'NOX' 'RM' 'AGE' 'DIS' 'RAD' 'TAX' 'PTRATIO'\n", 84 | " 'B' 'LSTAT']\n" 85 | ] 86 | } 87 | ], 88 | "source": [ 89 | "# x_orgの内容を調べる\n", 90 | "\n", 91 | "print('クラス名:', type(x_org))\n", 92 | "print('サイズ:', x_org.shape)\n", 93 | "print('内容表示(一部):')\n", 94 | "print( x_org[:5,:])\n", 95 | "print('項目名: ', feature_names)" 96 | ] 97 | }, 98 | { 99 | "cell_type": "code", 100 | "execution_count": 5, 101 | "metadata": {}, 102 | "outputs": [], 103 | "source": [ 104 | "# x_org は506 x 13 の行列\n", 105 | "# この行列から'RM' の列だけを抽出する\n", 106 | "\n", 107 | "x_data = x_org[:,feature_names == 'RM']" 108 | ] 109 | }, 110 | { 111 | "cell_type": "code", 112 | "execution_count": 6, 113 | "metadata": {}, 114 | "outputs": [ 115 | { 116 | "name": "stdout", 117 | "output_type": "stream", 118 | "text": [ 119 | "絞り込み後のサイズ (506, 1)\n", 120 | "絞り込み後の内容(一部)\n", 121 | "[[6.575]\n", 122 | " [6.421]\n", 123 | " [7.185]\n", 124 | " [6.998]\n", 125 | " [7.147]]\n" 126 | ] 127 | } 128 | ], 129 | "source": [ 130 | "# 結果確認\n", 131 | "\n", 132 | "print('絞り込み後のサイズ', x_data.shape)\n", 133 | "print('絞り込み後の内容(一部)')\n", 134 | "print( x_data[:5])" 135 | ] 136 | }, 137 | { 138 | "cell_type": "code", 139 | "execution_count": 7, 140 | "metadata": {}, 141 | "outputs": [], 142 | "source": [ 143 | "# ダミー変数を追加\n", 144 | "\n", 145 | "x = np.insert(x_data, 0, 1.0, axis=1)" 146 | ] 147 | }, 148 | { 149 | "cell_type": "code", 150 | "execution_count": 8, 151 | "metadata": {}, 152 | "outputs": [ 153 | { 154 | "name": "stdout", 155 | "output_type": "stream", 156 | "text": [ 157 | "ダミー変数追加後のサイズ (506, 2)\n", 158 | "ダミー変数追加後の内容(一部):\n", 159 | "[[1. 6.575]\n", 160 | " [1. 6.421]\n", 161 | " [1. 7.185]\n", 162 | " [1. 6.998]\n", 163 | " [1. 7.147]]\n" 164 | ] 165 | } 166 | ], 167 | "source": [ 168 | "# 結果確認\n", 169 | "\n", 170 | "print('ダミー変数追加後のサイズ', x.shape)\n", 171 | "print('ダミー変数追加後の内容(一部):')\n", 172 | "print( x[:5,:])" 173 | ] 174 | }, 175 | { 176 | "cell_type": "markdown", 177 | "metadata": {}, 178 | "source": [ 179 | "## 重回帰用データ追加" 180 | ] 181 | }, 182 | { 183 | "cell_type": "code", 184 | "execution_count": 9, 185 | "metadata": {}, 186 | "outputs": [], 187 | "source": [ 188 | "# 列(LSTAT: 低所得者率)の取得\n", 189 | "x_add = x_org[:,feature_names == 'LSTAT']" 190 | ] 191 | }, 192 | { 193 | "cell_type": "code", 194 | "execution_count": 10, 195 | "metadata": {}, 196 | "outputs": [ 197 | { 198 | "name": "stdout", 199 | "output_type": "stream", 200 | "text": [ 201 | "絞り込み後のサイズ (506, 1)\n", 202 | "絞り込み後の内容(一部)\n", 203 | "[[4.98]\n", 204 | " [9.14]\n", 205 | " [4.03]\n", 206 | " [2.94]\n", 207 | " [5.33]]\n" 208 | ] 209 | } 210 | ], 211 | "source": [ 212 | "# 結果確認\n", 213 | "print('絞り込み後のサイズ', x_add.shape)\n", 214 | "print('絞り込み後の内容(一部)')\n", 215 | "print( x_add[:5])" 216 | ] 217 | }, 218 | { 219 | "cell_type": "code", 220 | "execution_count": 11, 221 | "metadata": {}, 222 | "outputs": [], 223 | "source": [ 224 | "# xに列を追加\n", 225 | "x2 = np.hstack((x, x_add))" 226 | ] 227 | }, 228 | { 229 | "cell_type": "code", 230 | "execution_count": 12, 231 | "metadata": {}, 232 | "outputs": [ 233 | { 234 | "name": "stdout", 235 | "output_type": "stream", 236 | "text": [ 237 | "絞り込み後のサイズ (506, 3)\n", 238 | "絞り込み後の内容(一部)\n", 239 | "[[1. 6.575 4.98 ]\n", 240 | " [1. 6.421 9.14 ]\n", 241 | " [1. 7.185 4.03 ]\n", 242 | " [1. 6.998 2.94 ]\n", 243 | " [1. 7.147 5.33 ]]\n" 244 | ] 245 | } 246 | ], 247 | "source": [ 248 | "# 結果確認\n", 249 | "print('絞り込み後のサイズ', x2.shape)\n", 250 | "print('絞り込み後の内容(一部)')\n", 251 | "print( x2[:5])" 252 | ] 253 | }, 254 | { 255 | "cell_type": "code", 256 | "execution_count": null, 257 | "metadata": {}, 258 | "outputs": [], 259 | "source": [] 260 | } 261 | ], 262 | "metadata": { 263 | "kernelspec": { 264 | "display_name": "Python 3", 265 | "language": "python", 266 | "name": "python3" 267 | }, 268 | "language_info": { 269 | "codemirror_mode": { 270 | "name": "ipython", 271 | "version": 3 272 | }, 273 | "file_extension": ".py", 274 | "mimetype": "text/x-python", 275 | "name": "python", 276 | "nbconvert_exporter": "python", 277 | "pygments_lexer": "ipython3", 278 | "version": "3.7.3" 279 | } 280 | }, 281 | "nbformat": 4, 282 | "nbformat_minor": 2 283 | } 284 | -------------------------------------------------------------------------------- /notebooks/12-python2.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "## Python基本文法2\n", 8 | "文字列から関数定義まで" 9 | ] 10 | }, 11 | { 12 | "cell_type": "markdown", 13 | "metadata": {}, 14 | "source": [ 15 | "### 文字列\n", 16 | "\n", 17 | "文字列はstrという型を持っていますが、文字の配列としての性質も持っています。" 18 | ] 19 | }, 20 | { 21 | "cell_type": "code", 22 | "execution_count": null, 23 | "metadata": {}, 24 | "outputs": [], 25 | "source": [ 26 | "str1 = 'Hello World!'" 27 | ] 28 | }, 29 | { 30 | "cell_type": "code", 31 | "execution_count": null, 32 | "metadata": {}, 33 | "outputs": [], 34 | "source": [ 35 | "# クラス名が表示される (文字列クラスとしての振る舞い)\n", 36 | "\n", 37 | "print(type(str1))" 38 | ] 39 | }, 40 | { 41 | "cell_type": "code", 42 | "execution_count": null, 43 | "metadata": {}, 44 | "outputs": [], 45 | "source": [ 46 | "# 文字数が表示される (配列としての振る舞い)\n", 47 | "\n", 48 | "print(len(str1))" 49 | ] 50 | }, 51 | { 52 | "cell_type": "code", 53 | "execution_count": null, 54 | "metadata": {}, 55 | "outputs": [], 56 | "source": [ 57 | "# 最初の文字が表示される (配列としての振る舞い)\n", 58 | "\n", 59 | "print(str1[0])" 60 | ] 61 | }, 62 | { 63 | "cell_type": "code", 64 | "execution_count": null, 65 | "metadata": {}, 66 | "outputs": [], 67 | "source": [ 68 | "# 0以上5未満の要素が表示 (配列としての振る舞い)\n", 69 | "\n", 70 | "print(str1[0:5])" 71 | ] 72 | }, 73 | { 74 | "cell_type": "markdown", 75 | "metadata": {}, 76 | "source": [ 77 | "#### print関数の利用\n", 78 | "\n", 79 | " print関数で、文字列と数値をつないで表示したい場合、複数のパラメータを列挙する形にします。" 80 | ] 81 | }, 82 | { 83 | "cell_type": "code", 84 | "execution_count": null, 85 | "metadata": {}, 86 | "outputs": [], 87 | "source": [ 88 | "# 整数変数\n", 89 | "\n", 90 | "x1 = 1\n", 91 | "\n", 92 | "# 浮動小数点変数\n", 93 | "\n", 94 | "x2 = 2.0\n", 95 | "\n", 96 | "# 整数の表示\n", 97 | "print('x1 = ', x1, ' x2 = ', x2)" 98 | ] 99 | }, 100 | { 101 | "cell_type": "code", 102 | "execution_count": null, 103 | "metadata": {}, 104 | "outputs": [], 105 | "source": [ 106 | "# print文実行の別方法\n", 107 | "# (書式つき文字列)\n", 108 | "\n", 109 | "print('x1 = %d x2 = %3.1f' % (x1, x2))" 110 | ] 111 | }, 112 | { 113 | "cell_type": "markdown", 114 | "metadata": {}, 115 | "source": [ 116 | "### range関数\n", 117 | "\n", 118 | "``range``関数を使うと、数値を要素をとしてもつリストを一気に作ることができます。 \n", 119 | "Python3では、そのままprint関数にかけると``range``オブジェクトとして表示されてしまうので、 \n", 120 | "``print``関数でその内容を見たい場合は、その結果を``list``関数にかけます。" 121 | ] 122 | }, 123 | { 124 | "cell_type": "code", 125 | "execution_count": null, 126 | "metadata": {}, 127 | "outputs": [], 128 | "source": [ 129 | "# 1引数の例 (0から10未満まで)\n", 130 | "\n", 131 | "print(range(10))\n", 132 | "print(list(range(10)))" 133 | ] 134 | }, 135 | { 136 | "cell_type": "code", 137 | "execution_count": null, 138 | "metadata": {}, 139 | "outputs": [], 140 | "source": [ 141 | "# 2引数の例 (2から10未満まで)\n", 142 | "\n", 143 | "print(list(range(2, 10)))" 144 | ] 145 | }, 146 | { 147 | "cell_type": "code", 148 | "execution_count": null, 149 | "metadata": {}, 150 | "outputs": [], 151 | "source": [ 152 | "# 3引数の例 (1から11未満まで2刻み)\n", 153 | "\n", 154 | "print(list(range(1, 11, 2)))" 155 | ] 156 | }, 157 | { 158 | "cell_type": "markdown", 159 | "metadata": {}, 160 | "source": [ 161 | "### 辞書(key-value)\n", 162 | "\n", 163 | "辞書型のデータも扱うことができます。 \n", 164 | "辞書は``dict['key1']``のような形で参照します。 \n", 165 | "他のプログラム言語でハッシュ型とか連想配列を呼ばれる型になります。" 166 | ] 167 | }, 168 | { 169 | "cell_type": "code", 170 | "execution_count": null, 171 | "metadata": {}, 172 | "outputs": [], 173 | "source": [ 174 | "# 辞書型の宣言\n", 175 | "\n", 176 | "dict = {\n", 177 | " 'key1': 1,\n", 178 | " 'key2': 2.0,\n", 179 | " 'key3': 'abc'\n", 180 | "}" 181 | ] 182 | }, 183 | { 184 | "cell_type": "code", 185 | "execution_count": null, 186 | "metadata": {}, 187 | "outputs": [], 188 | "source": [ 189 | "# キーから値の取得\n", 190 | "\n", 191 | "print(dict['key1'])\n", 192 | "print(dict['key2'])\n", 193 | "print(dict['key3'])" 194 | ] 195 | }, 196 | { 197 | "cell_type": "code", 198 | "execution_count": null, 199 | "metadata": {}, 200 | "outputs": [], 201 | "source": [ 202 | "# キーの一覧表示\n", 203 | "\n", 204 | "keys = dict.keys()\n", 205 | "print(keys)" 206 | ] 207 | }, 208 | { 209 | "cell_type": "code", 210 | "execution_count": null, 211 | "metadata": {}, 212 | "outputs": [], 213 | "source": [ 214 | "# ソートしたい場合\n", 215 | "print(sorted(keys))" 216 | ] 217 | }, 218 | { 219 | "cell_type": "code", 220 | "execution_count": null, 221 | "metadata": {}, 222 | "outputs": [], 223 | "source": [ 224 | "# 値の一覧表示\n", 225 | "\n", 226 | "values = dict.values()\n", 227 | "print(values)" 228 | ] 229 | }, 230 | { 231 | "cell_type": "markdown", 232 | "metadata": {}, 233 | "source": [ 234 | "#### items関数\n", 235 | "\n", 236 | "辞書型データに対しては、``keys()``や``values()``という関数以外に``items()``という関数があり、 \n", 237 | "``(key, value)``のペアをリストにして取得できます。 \n", 238 | "この関数は、後で説明するループ処理の時に便利な関数です。" 239 | ] 240 | }, 241 | { 242 | "cell_type": "code", 243 | "execution_count": null, 244 | "metadata": {}, 245 | "outputs": [], 246 | "source": [ 247 | "print(dict)\n", 248 | "print(dict.items())" 249 | ] 250 | }, 251 | { 252 | "cell_type": "markdown", 253 | "metadata": {}, 254 | "source": [ 255 | "### 分岐\n", 256 | "\n", 257 | "Pythonの他の言語との大きな違いの一つとしては分岐、ループなどの制御構造の書き方があります。 \n", 258 | "制御構造の始まりの行は:で終わります。 \n", 259 | "また、制御構造の内部はインデント(字下げ)で表現します。\n", 260 | "(インデントの時はタブキーを入力) \n", 261 | "字下げが文法的に意味があるということです。 \n", 262 | "こうすることで、制御構造の戻りの記述が不要になり、プログラムが見やすくなっています。" 263 | ] 264 | }, 265 | { 266 | "cell_type": "code", 267 | "execution_count": null, 268 | "metadata": {}, 269 | "outputs": [], 270 | "source": [ 271 | "list4 = [0, 1, 2, 3]\n", 272 | "if list4[0] == 0:\n", 273 | " print('true branch')\n", 274 | "else:\n", 275 | " print('false branch')\n", 276 | "\n", 277 | "list4[0] = 1\n", 278 | "if list4[0] == 0:\n", 279 | " print('true branch')\n", 280 | "else:\n", 281 | " print('false branch')" 282 | ] 283 | }, 284 | { 285 | "cell_type": "markdown", 286 | "metadata": {}, 287 | "source": [ 288 | "### ループ\n", 289 | "\n", 290 | "ループも分岐同様、始まりが:でループ内部をインデントで表現します。 \n", 291 | "forループの場合、制御変数を使うことはあまりなく、 \n", 292 | "\n", 293 | "for (要素) in (List): \n", 294 | " (要素を使った処理) \n", 295 | "\n", 296 | "で組むことが多いです。\n" 297 | ] 298 | }, 299 | { 300 | "cell_type": "code", 301 | "execution_count": null, 302 | "metadata": {}, 303 | "outputs": [], 304 | "source": [ 305 | "list5 = ['one', 'two', 'three']\n", 306 | "for item in list5:\n", 307 | " print(item)" 308 | ] 309 | }, 310 | { 311 | "cell_type": "code", 312 | "execution_count": null, 313 | "metadata": {}, 314 | "outputs": [], 315 | "source": [ 316 | "# range関数とループを組み合わせた例\n", 317 | "for index in range(5):\n", 318 | " print(index)" 319 | ] 320 | }, 321 | { 322 | "cell_type": "code", 323 | "execution_count": null, 324 | "metadata": {}, 325 | "outputs": [], 326 | "source": [ 327 | "# 辞書型データを対象にしたループ処理\n", 328 | "dict = {\n", 329 | " 'key1': 1,\n", 330 | " 'key2': 2.0,\n", 331 | " 'key3': 'abc'\n", 332 | "}\n", 333 | "\n", 334 | "# 辞書型変数dictに対してitems()関数で(key, value)をセットで取得します。\n", 335 | "\n", 336 | "for key, value in dict.items():\n", 337 | " print(key, ' = ', value)" 338 | ] 339 | }, 340 | { 341 | "cell_type": "markdown", 342 | "metadata": {}, 343 | "source": [ 344 | "#### リスト内包表記\n", 345 | "\n", 346 | "リスト内包表記はPython固有の表記法の一つです。 \n", 347 | "ループ処理を簡潔で直感的にわかりやすい表記で記述することができます。 \n", 348 | "機械学習のコーディングでよく出てくるので、是非使えるようにして下さい。" 349 | ] 350 | }, 351 | { 352 | "cell_type": "markdown", 353 | "metadata": {}, 354 | "source": [ 355 | "![](https://github.com/makaishi2/kcgi-course-contents/raw/master/images/python-fig1.png)" 356 | ] 357 | }, 358 | { 359 | "cell_type": "code", 360 | "execution_count": null, 361 | "metadata": {}, 362 | "outputs": [], 363 | "source": [ 364 | "list_str = ['abc', 'def', 'ghi']" 365 | ] 366 | }, 367 | { 368 | "cell_type": "code", 369 | "execution_count": null, 370 | "metadata": {}, 371 | "outputs": [], 372 | "source": [ 373 | "# 「リスト内包表記」の実装サンプル\n", 374 | "# 各要素の後ろに':'を追加\n", 375 | "\n", 376 | "ret3 = [item + ':' for item in list_str]\n", 377 | "print(ret3)" 378 | ] 379 | }, 380 | { 381 | "cell_type": "markdown", 382 | "metadata": {}, 383 | "source": [ 384 | "![](https://github.com/makaishi2/kcgi-course-contents/raw/master/images/python-fig2.png)" 385 | ] 386 | }, 387 | { 388 | "cell_type": "code", 389 | "execution_count": null, 390 | "metadata": {}, 391 | "outputs": [], 392 | "source": [ 393 | "# 「リスト内包表記」をifと組みあわせた実装サンプル\n", 394 | "# 前の計算結果のうち、要素が'def'のものを除く\n", 395 | "\n", 396 | "ret4 = [item + ':' for item in list_str if item != 'def']\n", 397 | "print(ret4)" 398 | ] 399 | }, 400 | { 401 | "cell_type": "markdown", 402 | "metadata": {}, 403 | "source": [ 404 | "### enumerate関数\n", 405 | "\n", 406 | "``enumerate``関数を使うと、リストから``(index, element)``のペアを生成することができます。 \n", 407 | "この関数はループ処理で便利です。" 408 | ] 409 | }, 410 | { 411 | "cell_type": "code", 412 | "execution_count": null, 413 | "metadata": {}, 414 | "outputs": [], 415 | "source": [ 416 | "list5 = ['one', 'two', 'three']\n", 417 | "\n", 418 | "for index, item in enumerate(list5):\n", 419 | " print(index, ': ', item)" 420 | ] 421 | }, 422 | { 423 | "cell_type": "markdown", 424 | "metadata": {}, 425 | "source": [ 426 | "### 関数\n", 427 | "\n", 428 | "関数も分岐、ループ同様インデントで関数内部を表現します。\n" 429 | ] 430 | }, 431 | { 432 | "cell_type": "code", 433 | "execution_count": null, 434 | "metadata": {}, 435 | "outputs": [], 436 | "source": [ 437 | "# 関数定義の例\n", 438 | "\n", 439 | "def square(x) :\n", 440 | " return x * x" 441 | ] 442 | }, 443 | { 444 | "cell_type": "code", 445 | "execution_count": null, 446 | "metadata": {}, 447 | "outputs": [], 448 | "source": [ 449 | "# 関数呼出しの例\n", 450 | "\n", 451 | "print(square(3))" 452 | ] 453 | }, 454 | { 455 | "cell_type": "code", 456 | "execution_count": null, 457 | "metadata": {}, 458 | "outputs": [], 459 | "source": [ 460 | "# 無名関数(lambda式)を使った関数定義の例\n", 461 | "\n", 462 | "square2 = lambda x: x**2\n", 463 | "print(square2(3))" 464 | ] 465 | }, 466 | { 467 | "cell_type": "code", 468 | "execution_count": null, 469 | "metadata": {}, 470 | "outputs": [], 471 | "source": [ 472 | "# 複数の値を返す関数の例\n", 473 | "def powers(x):\n", 474 | " return x ** 2, x ** 3, x ** 4" 475 | ] 476 | }, 477 | { 478 | "cell_type": "code", 479 | "execution_count": null, 480 | "metadata": {}, 481 | "outputs": [], 482 | "source": [ 483 | "x2, x3, x4 = powers(5)\n", 484 | "print('x2 = ', x2)\n", 485 | "print('x3 = ', x3)\n", 486 | "print('x4 = ', x4)\n" 487 | ] 488 | }, 489 | { 490 | "cell_type": "code", 491 | "execution_count": null, 492 | "metadata": {}, 493 | "outputs": [], 494 | "source": [] 495 | } 496 | ], 497 | "metadata": { 498 | "kernelspec": { 499 | "display_name": "Python 3", 500 | "language": "python", 501 | "name": "python3" 502 | }, 503 | "language_info": { 504 | "codemirror_mode": { 505 | "name": "ipython", 506 | "version": 3 507 | }, 508 | "file_extension": ".py", 509 | "mimetype": "text/x-python", 510 | "name": "python", 511 | "nbconvert_exporter": "python", 512 | "pygments_lexer": "ipython3", 513 | "version": "3.7.3" 514 | } 515 | }, 516 | "nbformat": 4, 517 | "nbformat_minor": 1 518 | } 519 | -------------------------------------------------------------------------------- /notebooks/11-python1.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "## Python基本文法1\n", 8 | "変数からタプルまで" 9 | ] 10 | }, 11 | { 12 | "cell_type": "markdown", 13 | "metadata": {}, 14 | "source": [ 15 | "### 変数の型\n", 16 | "Pythonの変数には**整数型**、**浮動小数点型**、**文字列型**、**ブーリアン型**などがあります。 \n", 17 | "C言語のような型の宣言は不要で、代入された値から自動的に型の設定がされます。 \n", 18 | "変数がどの型を持っているかは、``type``関数で調べることができます。 \n", 19 | "また、変数の値そのものは ``print``関数で表示できます。" 20 | ] 21 | }, 22 | { 23 | "cell_type": "code", 24 | "execution_count": 1, 25 | "metadata": {}, 26 | "outputs": [ 27 | { 28 | "name": "stdout", 29 | "output_type": "stream", 30 | "text": [ 31 | "2\n", 32 | "\n" 33 | ] 34 | } 35 | ], 36 | "source": [ 37 | "# 整数型の例\n", 38 | "\n", 39 | "x1 = 2\n", 40 | "print(x1)\n", 41 | "print(type(x1))" 42 | ] 43 | }, 44 | { 45 | "cell_type": "code", 46 | "execution_count": 2, 47 | "metadata": {}, 48 | "outputs": [ 49 | { 50 | "name": "stdout", 51 | "output_type": "stream", 52 | "text": [ 53 | "3.0\n", 54 | "\n" 55 | ] 56 | } 57 | ], 58 | "source": [ 59 | "# 浮動小数点型の例\n", 60 | "\n", 61 | "x2 = 3.0\n", 62 | "print(x2)\n", 63 | "print(type(x2))" 64 | ] 65 | }, 66 | { 67 | "cell_type": "code", 68 | "execution_count": 3, 69 | "metadata": {}, 70 | "outputs": [ 71 | { 72 | "name": "stdout", 73 | "output_type": "stream", 74 | "text": [ 75 | "abc\n", 76 | "\n" 77 | ] 78 | } 79 | ], 80 | "source": [ 81 | "# 文字列型の例\n", 82 | "\n", 83 | "x3 = 'abc'\n", 84 | "print(x3)\n", 85 | "print(type(x3))" 86 | ] 87 | }, 88 | { 89 | "cell_type": "code", 90 | "execution_count": 4, 91 | "metadata": {}, 92 | "outputs": [ 93 | { 94 | "name": "stdout", 95 | "output_type": "stream", 96 | "text": [ 97 | "True\n", 98 | "\n" 99 | ] 100 | } 101 | ], 102 | "source": [ 103 | "# ブーリアン型(True/False)の例\n", 104 | "\n", 105 | "x4 = True\n", 106 | "print(x4)\n", 107 | "print(type(x4))" 108 | ] 109 | }, 110 | { 111 | "cell_type": "markdown", 112 | "metadata": {}, 113 | "source": [ 114 | "### 演算\n", 115 | "\n", 116 | "数値間の演算は他のプログラム言語同様 ``+, -, *, /`` 等を使います。 \n", 117 | "文字列同士の連結にも ``+`` を使います。" 118 | ] 119 | }, 120 | { 121 | "cell_type": "code", 122 | "execution_count": 5, 123 | "metadata": {}, 124 | "outputs": [ 125 | { 126 | "name": "stdout", 127 | "output_type": "stream", 128 | "text": [ 129 | "5 \n" 130 | ] 131 | } 132 | ], 133 | "source": [ 134 | "# 整数同士の和\n", 135 | "\n", 136 | "x1 = 2\n", 137 | "y1 = 3\n", 138 | "z1 = x1 + y1\n", 139 | "print(z1, type(z1))" 140 | ] 141 | }, 142 | { 143 | "cell_type": "code", 144 | "execution_count": 6, 145 | "metadata": {}, 146 | "outputs": [ 147 | { 148 | "name": "stdout", 149 | "output_type": "stream", 150 | "text": [ 151 | "5.0 \n" 152 | ] 153 | } 154 | ], 155 | "source": [ 156 | "# 浮動小数点同士の和\n", 157 | "\n", 158 | "x2 = 3.0\n", 159 | "y2 = 2.0\n", 160 | "z2 = x2 + y2\n", 161 | "print(z2, type(z2)) " 162 | ] 163 | }, 164 | { 165 | "cell_type": "code", 166 | "execution_count": 7, 167 | "metadata": {}, 168 | "outputs": [ 169 | { 170 | "name": "stdout", 171 | "output_type": "stream", 172 | "text": [ 173 | "abcXYZ \n" 174 | ] 175 | } 176 | ], 177 | "source": [ 178 | "# 文字列の連結\n", 179 | "\n", 180 | "x3 = 'abc'\n", 181 | "y3 = 'XYZ'\n", 182 | "z3 = x3 + y3\n", 183 | "print(z3, type(z3))" 184 | ] 185 | }, 186 | { 187 | "cell_type": "code", 188 | "execution_count": 8, 189 | "metadata": {}, 190 | "outputs": [ 191 | { 192 | "name": "stdout", 193 | "output_type": "stream", 194 | "text": [ 195 | "4.0 \n" 196 | ] 197 | } 198 | ], 199 | "source": [ 200 | "# 整数と浮動小数点間の演算\n", 201 | "# 自動的に方が浮動小数点に合わせられる\n", 202 | "\n", 203 | "y4 = x1 + y2\n", 204 | "print(y4, type(y4))" 205 | ] 206 | }, 207 | { 208 | "cell_type": "markdown", 209 | "metadata": {}, 210 | "source": [ 211 | "#### 比較演算子\n", 212 | "比較演算子は ``==`` です。" 213 | ] 214 | }, 215 | { 216 | "cell_type": "code", 217 | "execution_count": 9, 218 | "metadata": {}, 219 | "outputs": [ 220 | { 221 | "name": "stdout", 222 | "output_type": "stream", 223 | "text": [ 224 | "True\n", 225 | "False\n" 226 | ] 227 | } 228 | ], 229 | "source": [ 230 | "x1 = 2\n", 231 | "y1 = 3\n", 232 | "w1 = 2\n", 233 | "\n", 234 | "print(w1 == x1)\n", 235 | "print(w1 == y1)" 236 | ] 237 | }, 238 | { 239 | "cell_type": "markdown", 240 | "metadata": {}, 241 | "source": [ 242 | "#### 論理演算子\n", 243 | "\n", 244 | "論理演算子は ``and``, ``or``, ``not``です。" 245 | ] 246 | }, 247 | { 248 | "cell_type": "code", 249 | "execution_count": 10, 250 | "metadata": {}, 251 | "outputs": [], 252 | "source": [ 253 | "t1 = True\n", 254 | "t2 = True\n", 255 | "f1 = False\n", 256 | "f2 = False" 257 | ] 258 | }, 259 | { 260 | "cell_type": "code", 261 | "execution_count": 11, 262 | "metadata": {}, 263 | "outputs": [ 264 | { 265 | "name": "stdout", 266 | "output_type": "stream", 267 | "text": [ 268 | "True False\n" 269 | ] 270 | } 271 | ], 272 | "source": [ 273 | "# AND演算\n", 274 | "\n", 275 | "p1 = t1 and t2\n", 276 | "p2 = t1 and f2\n", 277 | "print(p1, p2)" 278 | ] 279 | }, 280 | { 281 | "cell_type": "code", 282 | "execution_count": 12, 283 | "metadata": {}, 284 | "outputs": [ 285 | { 286 | "name": "stdout", 287 | "output_type": "stream", 288 | "text": [ 289 | "True False\n" 290 | ] 291 | } 292 | ], 293 | "source": [ 294 | "# OR演算\n", 295 | "\n", 296 | "q1 = t1 or f1\n", 297 | "q2 = f1 or f2\n", 298 | "print(q1, q2)" 299 | ] 300 | }, 301 | { 302 | "cell_type": "code", 303 | "execution_count": 13, 304 | "metadata": {}, 305 | "outputs": [ 306 | { 307 | "name": "stdout", 308 | "output_type": "stream", 309 | "text": [ 310 | "False True\n" 311 | ] 312 | } 313 | ], 314 | "source": [ 315 | "# NOT演算\n", 316 | "\n", 317 | "r1 = not t1\n", 318 | "r2 = not f1\n", 319 | "print(r1, r2)" 320 | ] 321 | }, 322 | { 323 | "cell_type": "markdown", 324 | "metadata": {}, 325 | "source": [ 326 | "### リスト\n", 327 | "\n", 328 | "リストは``[x, y, ...]``のような形式で表現します。 \n", 329 | "第一要素は``list[0]``, 第二要素は``list[1]``で参照します。 \n", 330 | "リストの長さを知りたいときは``len``関数を使います。" 331 | ] 332 | }, 333 | { 334 | "cell_type": "code", 335 | "execution_count": 14, 336 | "metadata": {}, 337 | "outputs": [], 338 | "source": [ 339 | "# リストの定義\n", 340 | "\n", 341 | "list1 = [2, 4, 6, 8, 10, 12, 14]" 342 | ] 343 | }, 344 | { 345 | "cell_type": "code", 346 | "execution_count": 15, 347 | "metadata": {}, 348 | "outputs": [ 349 | { 350 | "name": "stdout", 351 | "output_type": "stream", 352 | "text": [ 353 | "\n" 354 | ] 355 | } 356 | ], 357 | "source": [ 358 | "# 型は\"list\"\n", 359 | "\n", 360 | "print(type(list1))" 361 | ] 362 | }, 363 | { 364 | "cell_type": "code", 365 | "execution_count": 16, 366 | "metadata": {}, 367 | "outputs": [ 368 | { 369 | "name": "stdout", 370 | "output_type": "stream", 371 | "text": [ 372 | "[2, 4, 6, 8, 10, 12, 14]\n" 373 | ] 374 | } 375 | ], 376 | "source": [ 377 | "# print関数にかけると、全要素が表示される\n", 378 | "\n", 379 | "print(list1)" 380 | ] 381 | }, 382 | { 383 | "cell_type": "code", 384 | "execution_count": 17, 385 | "metadata": {}, 386 | "outputs": [ 387 | { 388 | "name": "stdout", 389 | "output_type": "stream", 390 | "text": [ 391 | "2\n" 392 | ] 393 | } 394 | ], 395 | "source": [ 396 | "# 第一要素の表示\n", 397 | "\n", 398 | "print(list1[0])" 399 | ] 400 | }, 401 | { 402 | "cell_type": "code", 403 | "execution_count": 18, 404 | "metadata": {}, 405 | "outputs": [ 406 | { 407 | "name": "stdout", 408 | "output_type": "stream", 409 | "text": [ 410 | "4\n" 411 | ] 412 | } 413 | ], 414 | "source": [ 415 | "# 第二要素の表示\n", 416 | "\n", 417 | "print(list1[1])" 418 | ] 419 | }, 420 | { 421 | "cell_type": "code", 422 | "execution_count": 19, 423 | "metadata": {}, 424 | "outputs": [ 425 | { 426 | "name": "stdout", 427 | "output_type": "stream", 428 | "text": [ 429 | "7\n" 430 | ] 431 | } 432 | ], 433 | "source": [ 434 | "# リストの長さはlen関数で取得\n", 435 | "\n", 436 | "print(len(list1))" 437 | ] 438 | }, 439 | { 440 | "cell_type": "markdown", 441 | "metadata": {}, 442 | "source": [ 443 | "### 部分リスト\n", 444 | "\n", 445 | "``list[0:3]``のような形式の参照も可能で、 \n", 446 | "この式は第1要素から第3要素までを抜き出した部分リストとなります。 \n", 447 | "**「0以上で3より前」**という読み方をするとわかりやすいです。" 448 | ] 449 | }, 450 | { 451 | "cell_type": "code", 452 | "execution_count": 20, 453 | "metadata": {}, 454 | "outputs": [ 455 | { 456 | "name": "stdout", 457 | "output_type": "stream", 458 | "text": [ 459 | "[2, 4, 6]\n" 460 | ] 461 | } 462 | ], 463 | "source": [ 464 | "# list[0]から list[3]より前\n", 465 | "\n", 466 | "print(list1[0:3])" 467 | ] 468 | }, 469 | { 470 | "cell_type": "markdown", 471 | "metadata": {}, 472 | "source": [ 473 | "#### 部分リストの参照パターン\n", 474 | "\n", 475 | "``list``を元に部分リストを作る方法には、以下のようないろいろなバリエーションがあります。 \n", 476 | "機械学習のコーディングでよく使われるテクニックなので、是非マスターして下さい。" 477 | ] 478 | }, 479 | { 480 | "cell_type": "code", 481 | "execution_count": 21, 482 | "metadata": {}, 483 | "outputs": [ 484 | { 485 | "name": "stdout", 486 | "output_type": "stream", 487 | "text": [ 488 | "[2, 4]\n", 489 | "[2, 4]\n" 490 | ] 491 | } 492 | ], 493 | "source": [ 494 | "# 最初からlist[2]より前\n", 495 | "print(list1[0:2])\n", 496 | "\n", 497 | "# 第一引数を省略すると\"0\"であるとみなされる\n", 498 | "print(list1[:2])" 499 | ] 500 | }, 501 | { 502 | "cell_type": "code", 503 | "execution_count": 22, 504 | "metadata": {}, 505 | "outputs": [ 506 | { 507 | "name": "stdout", 508 | "output_type": "stream", 509 | "text": [ 510 | "[6, 8, 10, 12, 14]\n", 511 | "[6, 8, 10, 12, 14]\n" 512 | ] 513 | } 514 | ], 515 | "source": [ 516 | "# list[2]から最後まで\n", 517 | "\n", 518 | "len1 = len(list1)\n", 519 | "print(list1[2:len1])\n", 520 | "\n", 521 | "# 第二引数を省略すると最終要素(len(list)))であるとみなされる\n", 522 | "print(list1[2:])" 523 | ] 524 | }, 525 | { 526 | "cell_type": "code", 527 | "execution_count": 23, 528 | "metadata": {}, 529 | "outputs": [ 530 | { 531 | "name": "stdout", 532 | "output_type": "stream", 533 | "text": [ 534 | "[2, 4, 6, 8, 10, 12, 14]\n" 535 | ] 536 | } 537 | ], 538 | "source": [ 539 | "# ':'' だけの場合は、元のリスト全体を表す\n", 540 | "\n", 541 | "print(list1[:])" 542 | ] 543 | }, 544 | { 545 | "cell_type": "code", 546 | "execution_count": 24, 547 | "metadata": {}, 548 | "outputs": [ 549 | { 550 | "name": "stdout", 551 | "output_type": "stream", 552 | "text": [ 553 | "[12, 14]\n" 554 | ] 555 | } 556 | ], 557 | "source": [ 558 | "# 後ろから2つ\n", 559 | "\n", 560 | "print(list1[-2:])" 561 | ] 562 | }, 563 | { 564 | "cell_type": "code", 565 | "execution_count": 25, 566 | "metadata": {}, 567 | "outputs": [ 568 | { 569 | "name": "stdout", 570 | "output_type": "stream", 571 | "text": [ 572 | "[2, 4, 6, 8, 10]\n" 573 | ] 574 | } 575 | ], 576 | "source": [ 577 | "# 後ろの2つを取り除いたもの\n", 578 | "\n", 579 | "print(list1[:-2])" 580 | ] 581 | }, 582 | { 583 | "cell_type": "code", 584 | "execution_count": 26, 585 | "metadata": {}, 586 | "outputs": [ 587 | { 588 | "name": "stdout", 589 | "output_type": "stream", 590 | "text": [ 591 | "[2, 6, 10, 14]\n" 592 | ] 593 | } 594 | ], 595 | "source": [ 596 | "# 普段は使わないのですが、listには3つめの引数もあり、これを使うとこんなことも可能です\n", 597 | "\n", 598 | "# 一つおき\n", 599 | "\n", 600 | "print(list1[::2])" 601 | ] 602 | }, 603 | { 604 | "cell_type": "code", 605 | "execution_count": 27, 606 | "metadata": {}, 607 | "outputs": [ 608 | { 609 | "name": "stdout", 610 | "output_type": "stream", 611 | "text": [ 612 | "[14, 12, 10, 8, 6, 4, 2]\n" 613 | ] 614 | } 615 | ], 616 | "source": [ 617 | "# 第三引数に-1を指定すると「逆順」を意味します\n", 618 | "\n", 619 | "print(list1[::-1])" 620 | ] 621 | }, 622 | { 623 | "cell_type": "markdown", 624 | "metadata": {}, 625 | "source": [ 626 | "#### 異なる要素の混在\n", 627 | "\n", 628 | "リストの各要素は異なる型の混在もできます。" 629 | ] 630 | }, 631 | { 632 | "cell_type": "code", 633 | "execution_count": 28, 634 | "metadata": {}, 635 | "outputs": [ 636 | { 637 | "name": "stdout", 638 | "output_type": "stream", 639 | "text": [ 640 | "[1, 2.0, 'abc', False]\n" 641 | ] 642 | } 643 | ], 644 | "source": [ 645 | "list2 = [1, 2.0, 'abc', False]\n", 646 | "print(list2)" 647 | ] 648 | }, 649 | { 650 | "cell_type": "markdown", 651 | "metadata": {}, 652 | "source": [ 653 | "#### リストに要素の追加\n", 654 | "\n", 655 | "リストに要素を追加したい場合は、``append``関数を使います。" 656 | ] 657 | }, 658 | { 659 | "cell_type": "code", 660 | "execution_count": 29, 661 | "metadata": {}, 662 | "outputs": [ 663 | { 664 | "name": "stdout", 665 | "output_type": "stream", 666 | "text": [ 667 | "[1, 2.0, 'abc']\n" 668 | ] 669 | } 670 | ], 671 | "source": [ 672 | "# 空リストの定義\n", 673 | "list3 = []\n", 674 | "\n", 675 | "# 要素の追加\n", 676 | "list3.append(1)\n", 677 | "list3.append(2.0)\n", 678 | "list3.append('abc')\n", 679 | "print(list3)" 680 | ] 681 | }, 682 | { 683 | "cell_type": "markdown", 684 | "metadata": {}, 685 | "source": [ 686 | "#### リスト間の連結\n", 687 | "\n", 688 | "リストとリストを連結したい場合は、``+``演算子を使います。" 689 | ] 690 | }, 691 | { 692 | "cell_type": "code", 693 | "execution_count": 30, 694 | "metadata": {}, 695 | "outputs": [ 696 | { 697 | "name": "stdout", 698 | "output_type": "stream", 699 | "text": [ 700 | "[1, 2.0, 'abc', False, 1, 2.0, 'abc']\n" 701 | ] 702 | } 703 | ], 704 | "source": [ 705 | "list4 = list2 + list3\n", 706 | "print(list4)" 707 | ] 708 | }, 709 | { 710 | "cell_type": "markdown", 711 | "metadata": {}, 712 | "source": [ 713 | "### タプル\n", 714 | "\n", 715 | "リストと似たデータ型として「タプル」があります。 \n", 716 | "タプルは、値の変更不可能なリストであると考えて下さい。" 717 | ] 718 | }, 719 | { 720 | "cell_type": "code", 721 | "execution_count": 34, 722 | "metadata": {}, 723 | "outputs": [ 724 | { 725 | "name": "stdout", 726 | "output_type": "stream", 727 | "text": [ 728 | "(1, 3, 5, 7)\n", 729 | "\n" 730 | ] 731 | } 732 | ], 733 | "source": [ 734 | "# タプルの場合は[]でなく()で要素を囲みます\n", 735 | "\n", 736 | "tap1 = (1,3,5,7)\n", 737 | "print(tap1)\n", 738 | "print(type(tap1))" 739 | ] 740 | }, 741 | { 742 | "cell_type": "code", 743 | "execution_count": 35, 744 | "metadata": {}, 745 | "outputs": [ 746 | { 747 | "name": "stdout", 748 | "output_type": "stream", 749 | "text": [ 750 | "1 3\n" 751 | ] 752 | } 753 | ], 754 | "source": [ 755 | "# タプルの要素への参照はリスト同様[]で行います\n", 756 | "print(tap1[0], tap1[1])" 757 | ] 758 | }, 759 | { 760 | "cell_type": "code", 761 | "execution_count": 36, 762 | "metadata": {}, 763 | "outputs": [ 764 | { 765 | "ename": "TypeError", 766 | "evalue": "'tuple' object does not support item assignment", 767 | "output_type": "error", 768 | "traceback": [ 769 | "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", 770 | "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", 771 | "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;31m# 値を変更しようとすると 。。。\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mtap1\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m10\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", 772 | "\u001b[0;31mTypeError\u001b[0m: 'tuple' object does not support item assignment" 773 | ] 774 | } 775 | ], 776 | "source": [ 777 | "# 値を変更しようとすると 。。。\n", 778 | "tap1[1] = 10" 779 | ] 780 | }, 781 | { 782 | "cell_type": "code", 783 | "execution_count": 37, 784 | "metadata": {}, 785 | "outputs": [ 786 | { 787 | "name": "stdout", 788 | "output_type": "stream", 789 | "text": [ 790 | "[2, 4, 9, 8, 10]\n" 791 | ] 792 | } 793 | ], 794 | "source": [ 795 | "# リストの場合、上のこと(要素を後で変更する)は可能です\n", 796 | "\n", 797 | "list7 = [2,4,6,8,10]\n", 798 | "list7[2] = 9\n", 799 | "print(list7)" 800 | ] 801 | } 802 | ], 803 | "metadata": { 804 | "kernelspec": { 805 | "display_name": "Python 3", 806 | "language": "python", 807 | "name": "python3" 808 | }, 809 | "language_info": { 810 | "codemirror_mode": { 811 | "name": "ipython", 812 | "version": 3 813 | }, 814 | "file_extension": ".py", 815 | "mimetype": "text/x-python", 816 | "name": "python", 817 | "nbconvert_exporter": "python", 818 | "pygments_lexer": "ipython3", 819 | "version": "3.7.3" 820 | } 821 | }, 822 | "nbformat": 4, 823 | "nbformat_minor": 1 824 | } 825 | -------------------------------------------------------------------------------- /notebooks/13-numpy1.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "## Numpy入門1" 8 | ] 9 | }, 10 | { 11 | "cell_type": "markdown", 12 | "metadata": {}, 13 | "source": [ 14 | "### Numpyの特徴\n", 15 | "\n", 16 | "numpy配列を使って、配列計算を行えます。 \n", 17 | "NativeなPythonの機能と比較してNumpyを使うことにより次のメリットがあります。\n", 18 | "\n", 19 | "* 処理速度が早くなる\n", 20 | "* 配列の扱い方が柔軟\n", 21 | "* コードがシンプルになる\n", 22 | "\n", 23 | "より詳しい解説は例えば下記のリンク参照して下さい。 \n", 24 | "[numpyの何がすごいのか?](https://to-kei.net/python/data-analysis/what-is-numpy/)\n" 25 | ] 26 | }, 27 | { 28 | "cell_type": "markdown", 29 | "metadata": {}, 30 | "source": [ 31 | "### 一次元配列" 32 | ] 33 | }, 34 | { 35 | "cell_type": "markdown", 36 | "metadata": {}, 37 | "source": [ 38 | "#### 宣言" 39 | ] 40 | }, 41 | { 42 | "cell_type": "code", 43 | "execution_count": 1, 44 | "metadata": {}, 45 | "outputs": [], 46 | "source": [ 47 | "# ライブラリのロード\n", 48 | "import numpy as np\n", 49 | "\n", 50 | "# 一次元配列の作成\n", 51 | "# リスト配列を引数に、array関数でnumpy一次元配列を作ります。\n", 52 | "\n", 53 | "list1 = list(range(2,12,2))\n", 54 | "array1 = np.array(list1)" 55 | ] 56 | }, 57 | { 58 | "cell_type": "code", 59 | "execution_count": 2, 60 | "metadata": {}, 61 | "outputs": [ 62 | { 63 | "name": "stdout", 64 | "output_type": "stream", 65 | "text": [ 66 | "list配列: [2, 4, 6, 8, 10]\n", 67 | "numpy配列: [ 2 4 6 8 10]\n" 68 | ] 69 | }, 70 | { 71 | "data": { 72 | "text/plain": [ 73 | "array([ 2, 4, 6, 8, 10])" 74 | ] 75 | }, 76 | "execution_count": 2, 77 | "metadata": {}, 78 | "output_type": "execute_result" 79 | } 80 | ], 81 | "source": [ 82 | "# print文による表示結果の比較\n", 83 | "# 画面上はカンマのあるなしで区別します。\n", 84 | "\n", 85 | "print('list配列: ', list1)\n", 86 | "print('numpy配列: ', array1)\n", 87 | "array1" 88 | ] 89 | }, 90 | { 91 | "cell_type": "code", 92 | "execution_count": 3, 93 | "metadata": {}, 94 | "outputs": [ 95 | { 96 | "name": "stdout", 97 | "output_type": "stream", 98 | "text": [ 99 | "[ 2 4 6 8 10]\n" 100 | ] 101 | }, 102 | { 103 | "data": { 104 | "text/plain": [ 105 | "array([ 2, 4, 6, 8, 10], dtype=int32)" 106 | ] 107 | }, 108 | "execution_count": 3, 109 | "metadata": {}, 110 | "output_type": "execute_result" 111 | } 112 | ], 113 | "source": [ 114 | "# データ型(dtype)つき変数作成\n", 115 | "\n", 116 | "# 個々の要素をデータ型付きで定義することも可能です。\n", 117 | "# 型には、以下のようなものがあります。\n", 118 | "#\n", 119 | "# 符号付き整数: int8, int16, int32, int64\n", 120 | "# 符号なし整数: unit8, uint16, uint32, uint64\n", 121 | "# 浮動小数点: float16, float32, float64, float128\n", 122 | "\n", 123 | "array2 = np.array([2, 4, 6, 8,10], dtype=np.int32)\n", 124 | "print(array2)\n", 125 | "\n", 126 | "array2" 127 | ] 128 | }, 129 | { 130 | "cell_type": "code", 131 | "execution_count": 4, 132 | "metadata": {}, 133 | "outputs": [ 134 | { 135 | "name": "stdout", 136 | "output_type": "stream", 137 | "text": [ 138 | "\n" 139 | ] 140 | } 141 | ], 142 | "source": [ 143 | "# 型は' numpy.ndarray' となります\n", 144 | "\n", 145 | "print(type(array1))" 146 | ] 147 | }, 148 | { 149 | "cell_type": "code", 150 | "execution_count": 5, 151 | "metadata": {}, 152 | "outputs": [ 153 | { 154 | "name": "stdout", 155 | "output_type": "stream", 156 | "text": [ 157 | "(5,)\n" 158 | ] 159 | } 160 | ], 161 | "source": [ 162 | "# 配列の要素数は'shape'という属性で取得可能です\n", 163 | "# 結果はtuppleで返されます\n", 164 | "\n", 165 | "print(array1.shape)" 166 | ] 167 | }, 168 | { 169 | "cell_type": "markdown", 170 | "metadata": {}, 171 | "source": [ 172 | "#### 参照" 173 | ] 174 | }, 175 | { 176 | "cell_type": "code", 177 | "execution_count": 6, 178 | "metadata": {}, 179 | "outputs": [ 180 | { 181 | "name": "stdout", 182 | "output_type": "stream", 183 | "text": [ 184 | "2\n", 185 | "10\n" 186 | ] 187 | } 188 | ], 189 | "source": [ 190 | "# 要素の参照例\n", 191 | "\n", 192 | "# 先頭\n", 193 | "print(array1[0])\n", 194 | "\n", 195 | "# 一番後ろの要素は-1で参照できます\n", 196 | "print(array1[-1])" 197 | ] 198 | }, 199 | { 200 | "cell_type": "code", 201 | "execution_count": 7, 202 | "metadata": {}, 203 | "outputs": [ 204 | { 205 | "name": "stdout", 206 | "output_type": "stream", 207 | "text": [ 208 | "[2 4]\n", 209 | "[ 6 8 10]\n", 210 | "[ 2 4 6 8 10]\n" 211 | ] 212 | } 213 | ], 214 | "source": [ 215 | "# 範囲付き参照\n", 216 | "# このパターンはlist変数と同じです。\n", 217 | "\n", 218 | "# 0以上2未満\n", 219 | "print(array1[:2])\n", 220 | "\n", 221 | "# 2以上\n", 222 | "print(array1[2:])\n", 223 | "\n", 224 | "# 全部\n", 225 | "print(array1[:])" 226 | ] 227 | }, 228 | { 229 | "cell_type": "code", 230 | "execution_count": 8, 231 | "metadata": {}, 232 | "outputs": [ 233 | { 234 | "name": "stdout", 235 | "output_type": "stream", 236 | "text": [ 237 | "[ 2 6 10]\n", 238 | "[8 4]\n" 239 | ] 240 | } 241 | ], 242 | "source": [ 243 | "# こういうアクセス方法も可能です\n", 244 | "# (これはlistではできない)\n", 245 | "\n", 246 | "# array1の0番目、2番目、4番目\n", 247 | "print(array1[[0,2,4]])\n", 248 | "\n", 249 | "# array1の3番目、1番目\n", 250 | "print(array1[[3,1]])" 251 | ] 252 | }, 253 | { 254 | "cell_type": "markdown", 255 | "metadata": {}, 256 | "source": [ 257 | "#### 計算" 258 | ] 259 | }, 260 | { 261 | "cell_type": "code", 262 | "execution_count": 9, 263 | "metadata": {}, 264 | "outputs": [ 265 | { 266 | "name": "stdout", 267 | "output_type": "stream", 268 | "text": [ 269 | "[ 2 4 6 8 10]\n", 270 | "[0 1 2 3 4]\n" 271 | ] 272 | } 273 | ], 274 | "source": [ 275 | "# 計算の例\n", 276 | "# numpy配列を対象にすると計算を一気に行うことができます\n", 277 | "\n", 278 | "array1 = np.array(list(range(2,12,2)))\n", 279 | "array3 = np.array(list(range(5)))\n", 280 | "print(array1)\n", 281 | "print(array3)" 282 | ] 283 | }, 284 | { 285 | "cell_type": "code", 286 | "execution_count": 10, 287 | "metadata": {}, 288 | "outputs": [ 289 | { 290 | "name": "stdout", 291 | "output_type": "stream", 292 | "text": [ 293 | "[ 2 5 8 11 14]\n" 294 | ] 295 | } 296 | ], 297 | "source": [ 298 | "# 足し算\n", 299 | "# list変数だとループを回す必要があります\n", 300 | "\n", 301 | "array4 = array1 + array3\n", 302 | "print(array4)" 303 | ] 304 | }, 305 | { 306 | "cell_type": "markdown", 307 | "metadata": {}, 308 | "source": [ 309 | "#### ブロードキャスト機能" 310 | ] 311 | }, 312 | { 313 | "cell_type": "code", 314 | "execution_count": 11, 315 | "metadata": {}, 316 | "outputs": [ 317 | { 318 | "name": "stdout", 319 | "output_type": "stream", 320 | "text": [ 321 | "[ 5 7 9 11 13]\n" 322 | ] 323 | } 324 | ], 325 | "source": [ 326 | "# ブロードキャスト機能\n", 327 | "# サイズの異なる変数同士の演算では、サイズを自動的に合わせて計算します\n", 328 | "\n", 329 | "array5 = array1 + 3\n", 330 | "print(array5)" 331 | ] 332 | }, 333 | { 334 | "cell_type": "code", 335 | "execution_count": 12, 336 | "metadata": {}, 337 | "outputs": [ 338 | { 339 | "name": "stdout", 340 | "output_type": "stream", 341 | "text": [ 342 | "[0.69314718 1.38629436 1.79175947 2.07944154 2.30258509]\n" 343 | ] 344 | } 345 | ], 346 | "source": [ 347 | "# 関数呼び出し\n", 348 | "# numpy関数と組み合わせると、関数呼び出しも全要素分まとめて行えます\n", 349 | "\n", 350 | "# 対数関数の呼出し\n", 351 | "array6 = np.log(array1)\n", 352 | "print(array6)" 353 | ] 354 | }, 355 | { 356 | "cell_type": "markdown", 357 | "metadata": {}, 358 | "source": [ 359 | "#### 特定の条件を満たす要素の抽出" 360 | ] 361 | }, 362 | { 363 | "cell_type": "code", 364 | "execution_count": 13, 365 | "metadata": {}, 366 | "outputs": [ 367 | { 368 | "name": "stdout", 369 | "output_type": "stream", 370 | "text": [ 371 | "[ True False True False True]\n" 372 | ] 373 | } 374 | ], 375 | "source": [ 376 | "# ブロードキャスト機能とindex機能を組み合わせてこんなことも可能です\n", 377 | "# arr2 から偶数の要素だけを抜き出す\n", 378 | "\n", 379 | "array3 = np.array(list(range(5)))\n", 380 | "w = (array3 % 2) == 0\n", 381 | "print(w)" 382 | ] 383 | }, 384 | { 385 | "cell_type": "code", 386 | "execution_count": 14, 387 | "metadata": {}, 388 | "outputs": [ 389 | { 390 | "name": "stdout", 391 | "output_type": "stream", 392 | "text": [ 393 | "[0 2 4]\n" 394 | ] 395 | } 396 | ], 397 | "source": [ 398 | "array7 = array3[w]\n", 399 | "print(array7)" 400 | ] 401 | }, 402 | { 403 | "cell_type": "code", 404 | "execution_count": 15, 405 | "metadata": {}, 406 | "outputs": [ 407 | { 408 | "name": "stdout", 409 | "output_type": "stream", 410 | "text": [ 411 | "[0 2 4]\n" 412 | ] 413 | } 414 | ], 415 | "source": [ 416 | "# まとめて書くとこうなります\n", 417 | "\n", 418 | "array8 = array3[(array3 % 2) == 0]\n", 419 | "print(array8)" 420 | ] 421 | }, 422 | { 423 | "cell_type": "markdown", 424 | "metadata": {}, 425 | "source": [ 426 | "#### 内積" 427 | ] 428 | }, 429 | { 430 | "cell_type": "code", 431 | "execution_count": 16, 432 | "metadata": {}, 433 | "outputs": [ 434 | { 435 | "name": "stdout", 436 | "output_type": "stream", 437 | "text": [ 438 | "[ 2 4 6 8 10]\n", 439 | "[0 1 2 3 4]\n", 440 | "80\n" 441 | ] 442 | } 443 | ], 444 | "source": [ 445 | "# 内積\n", 446 | "# 記号 '@' を使って内積計算が可能です。\n", 447 | "\n", 448 | "array1 = np.array(list(range(2,12,2)))\n", 449 | "array3 = np.array(list(range(5)))\n", 450 | "print(array1)\n", 451 | "print(array3)\n", 452 | "\n", 453 | "p = array1 @ array3\n", 454 | "print(p)" 455 | ] 456 | }, 457 | { 458 | "cell_type": "markdown", 459 | "metadata": {}, 460 | "source": [ 461 | "### 二次元配列\n", 462 | "\n", 463 | "numpyでは行列のような二次元配列も扱えます。 " 464 | ] 465 | }, 466 | { 467 | "cell_type": "markdown", 468 | "metadata": {}, 469 | "source": [ 470 | "#### 宣言" 471 | ] 472 | }, 473 | { 474 | "cell_type": "code", 475 | "execution_count": 17, 476 | "metadata": {}, 477 | "outputs": [], 478 | "source": [ 479 | "# 二次元配列の宣言\n", 480 | "# この場合、引数はlistのlistとなります。\n", 481 | "\n", 482 | "array8 = np.array([[1,2,3,4,5], [6,7,8,9,10],[11,12,13,14,15]])" 483 | ] 484 | }, 485 | { 486 | "cell_type": "code", 487 | "execution_count": 18, 488 | "metadata": {}, 489 | "outputs": [ 490 | { 491 | "name": "stdout", 492 | "output_type": "stream", 493 | "text": [ 494 | "[[ 1 2 3 4 5]\n", 495 | " [ 6 7 8 9 10]\n", 496 | " [11 12 13 14 15]]\n" 497 | ] 498 | } 499 | ], 500 | "source": [ 501 | "# 二次元配列をprint関数にかけるとこのような表示になります\n", 502 | "\n", 503 | "print(array8)" 504 | ] 505 | }, 506 | { 507 | "cell_type": "code", 508 | "execution_count": 19, 509 | "metadata": {}, 510 | "outputs": [ 511 | { 512 | "name": "stdout", 513 | "output_type": "stream", 514 | "text": [ 515 | "(3, 5)\n" 516 | ] 517 | } 518 | ], 519 | "source": [ 520 | "# 要素数の取得\n", 521 | "\n", 522 | "print(array8.shape)" 523 | ] 524 | }, 525 | { 526 | "cell_type": "markdown", 527 | "metadata": {}, 528 | "source": [ 529 | "#### 参照" 530 | ] 531 | }, 532 | { 533 | "cell_type": "code", 534 | "execution_count": 20, 535 | "metadata": {}, 536 | "outputs": [ 537 | { 538 | "name": "stdout", 539 | "output_type": "stream", 540 | "text": [ 541 | "8\n" 542 | ] 543 | } 544 | ], 545 | "source": [ 546 | "# 要素の参照は「(第一次元引数),(第二次元引数)」の形式\n", 547 | "\n", 548 | "print(array8[1,2])" 549 | ] 550 | }, 551 | { 552 | "cell_type": "code", 553 | "execution_count": 21, 554 | "metadata": {}, 555 | "outputs": [ 556 | { 557 | "name": "stdout", 558 | "output_type": "stream", 559 | "text": [ 560 | "[[ 3 4 5]\n", 561 | " [ 8 9 10]]\n" 562 | ] 563 | } 564 | ], 565 | "source": [ 566 | "# それぞれの次元に対して範囲指定で参照することも可能\n", 567 | "\n", 568 | "print(array8[:2,2:])" 569 | ] 570 | }, 571 | { 572 | "cell_type": "markdown", 573 | "metadata": {}, 574 | "source": [ 575 | "#### 計算" 576 | ] 577 | }, 578 | { 579 | "cell_type": "code", 580 | "execution_count": 22, 581 | "metadata": {}, 582 | "outputs": [ 583 | { 584 | "name": "stdout", 585 | "output_type": "stream", 586 | "text": [ 587 | "[[ 3 6 9]\n", 588 | " [12 15 18]]\n" 589 | ] 590 | } 591 | ], 592 | "source": [ 593 | "# スカラー積\n", 594 | "\n", 595 | "a = np.array([[1,2,3],[4,5,6]])\n", 596 | "b = a * 3\n", 597 | "print(b)" 598 | ] 599 | }, 600 | { 601 | "cell_type": "code", 602 | "execution_count": 23, 603 | "metadata": {}, 604 | "outputs": [ 605 | { 606 | "name": "stdout", 607 | "output_type": "stream", 608 | "text": [ 609 | "[[4 5 6]\n", 610 | " [7 8 9]]\n" 611 | ] 612 | } 613 | ], 614 | "source": [ 615 | "# スカラー和\n", 616 | "\n", 617 | "a = np.array([[1,2,3],[4,5,6]])\n", 618 | "c = a + 3\n", 619 | "print(c)" 620 | ] 621 | }, 622 | { 623 | "cell_type": "code", 624 | "execution_count": 24, 625 | "metadata": {}, 626 | "outputs": [ 627 | { 628 | "name": "stdout", 629 | "output_type": "stream", 630 | "text": [ 631 | "[[ 4 8 12]\n", 632 | " [16 20 24]]\n" 633 | ] 634 | } 635 | ], 636 | "source": [ 637 | "# 行列同士の和\n", 638 | "\n", 639 | "d = a + b\n", 640 | "print(d)" 641 | ] 642 | }, 643 | { 644 | "cell_type": "code", 645 | "execution_count": 25, 646 | "metadata": {}, 647 | "outputs": [ 648 | { 649 | "name": "stdout", 650 | "output_type": "stream", 651 | "text": [ 652 | "[[1 2 3]\n", 653 | " [4 5 6]]\n", 654 | "[3 2 1]\n" 655 | ] 656 | } 657 | ], 658 | "source": [ 659 | "# 行列と1次元配列の内積\n", 660 | "\n", 661 | "a = np.array([[1,2,3],[4,5,6]])\n", 662 | "x = np.array([3,2,1])\n", 663 | "print(a)\n", 664 | "print(x)" 665 | ] 666 | }, 667 | { 668 | "cell_type": "code", 669 | "execution_count": 26, 670 | "metadata": {}, 671 | "outputs": [ 672 | { 673 | "name": "stdout", 674 | "output_type": "stream", 675 | "text": [ 676 | "[10 28]\n" 677 | ] 678 | } 679 | ], 680 | "source": [ 681 | "# '@'による内積\n", 682 | "# 行列とベクトルの積になる\n", 683 | "\n", 684 | "y = a @ x\n", 685 | "print(y)" 686 | ] 687 | }, 688 | { 689 | "cell_type": "code", 690 | "execution_count": 27, 691 | "metadata": {}, 692 | "outputs": [ 693 | { 694 | "name": "stdout", 695 | "output_type": "stream", 696 | "text": [ 697 | "[[ 3 4 3]\n", 698 | " [12 10 6]]\n" 699 | ] 700 | } 701 | ], 702 | "source": [ 703 | "# * による積\n", 704 | "# ブロードキャスト機能により要素間の積になる\n", 705 | "\n", 706 | "z = a * x\n", 707 | "print(z)" 708 | ] 709 | }, 710 | { 711 | "cell_type": "markdown", 712 | "metadata": {}, 713 | "source": [ 714 | "#### 特別な配列の生成" 715 | ] 716 | }, 717 | { 718 | "cell_type": "code", 719 | "execution_count": 28, 720 | "metadata": {}, 721 | "outputs": [ 722 | { 723 | "name": "stdout", 724 | "output_type": "stream", 725 | "text": [ 726 | "[[0. 0. 0.]\n", 727 | " [0. 0. 0.]]\n", 728 | "(2, 3)\n" 729 | ] 730 | } 731 | ], 732 | "source": [ 733 | "# 要素数(2,3) すべての要素が0の配列\n", 734 | "\n", 735 | "z23 = np.zeros((2,3))\n", 736 | "print(z23)\n", 737 | "print(z23.shape)" 738 | ] 739 | }, 740 | { 741 | "cell_type": "code", 742 | "execution_count": 29, 743 | "metadata": {}, 744 | "outputs": [ 745 | { 746 | "name": "stdout", 747 | "output_type": "stream", 748 | "text": [ 749 | "[[1. 1. 1.]\n", 750 | " [1. 1. 1.]]\n", 751 | "(2, 3)\n" 752 | ] 753 | } 754 | ], 755 | "source": [ 756 | "# 要素数(2,3) すべての要素が1の配列\n", 757 | "\n", 758 | "o23 = np.ones((2,3))\n", 759 | "print(o23)\n", 760 | "print(o23.shape)" 761 | ] 762 | }, 763 | { 764 | "cell_type": "code", 765 | "execution_count": 30, 766 | "metadata": {}, 767 | "outputs": [ 768 | { 769 | "name": "stdout", 770 | "output_type": "stream", 771 | "text": [ 772 | "[[0.24311266 0.61106348 0.88839895]\n", 773 | " [0.86712057 0.2341609 0.56575314]]\n", 774 | "(2, 3)\n" 775 | ] 776 | } 777 | ], 778 | "source": [ 779 | "# 要素数(2,3) すべての要素が[0,1]間の一様乱数の配列\n", 780 | "\n", 781 | "u23 = np.random.rand(2,3)\n", 782 | "print(u23)\n", 783 | "print(u23.shape)" 784 | ] 785 | }, 786 | { 787 | "cell_type": "code", 788 | "execution_count": 31, 789 | "metadata": {}, 790 | "outputs": [ 791 | { 792 | "name": "stdout", 793 | "output_type": "stream", 794 | "text": [ 795 | "[[ 0.24733984 1.3625211 -0.68888181]\n", 796 | " [ 0.14163477 -2.87562016 0.21906793]]\n", 797 | "(2, 3)\n" 798 | ] 799 | } 800 | ], 801 | "source": [ 802 | "# 要素数(2,3) すべての要素が平均0分散1の正規分布乱数の配列\n", 803 | "\n", 804 | "s23 = np.random.randn(2,3)\n", 805 | "print(s23)\n", 806 | "print(s23.shape)" 807 | ] 808 | }, 809 | { 810 | "cell_type": "code", 811 | "execution_count": null, 812 | "metadata": {}, 813 | "outputs": [], 814 | "source": [] 815 | } 816 | ], 817 | "metadata": { 818 | "kernelspec": { 819 | "display_name": "Python 3", 820 | "language": "python", 821 | "name": "python3" 822 | }, 823 | "language_info": { 824 | "codemirror_mode": { 825 | "name": "ipython", 826 | "version": 3 827 | }, 828 | "file_extension": ".py", 829 | "mimetype": "text/x-python", 830 | "name": "python", 831 | "nbconvert_exporter": "python", 832 | "pygments_lexer": "ipython3", 833 | "version": "3.7.3" 834 | } 835 | }, 836 | "nbformat": 4, 837 | "nbformat_minor": 1 838 | } 839 | -------------------------------------------------------------------------------- /notebooks/15-matplotlib.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "## Matplotlib入門" 8 | ] 9 | }, 10 | { 11 | "cell_type": "markdown", 12 | "metadata": {}, 13 | "source": [ 14 | "### Matplotlibとは\n", 15 | "\n", 16 | "PythonのJupyter Notebook環境でグラフ表示を行うためのライブラリです。 \n", 17 | "NumpyやPandasとの連携を前提に設計されており、簡潔なコードで様々なグラフ表示を行うことができます。 \n", 18 | "以下は7章の線形回帰の実習で出てくるMatplotlib呼出しコードの解説です。 \n", 19 | "(書籍内では説明が省かれています)" 20 | ] 21 | }, 22 | { 23 | "cell_type": "markdown", 24 | "metadata": {}, 25 | "source": [ 26 | "#### データ準備\n", 27 | "Numpy2で解説したコードなので、説明は省略します。" 28 | ] 29 | }, 30 | { 31 | "cell_type": "code", 32 | "execution_count": 1, 33 | "metadata": {}, 34 | "outputs": [], 35 | "source": [ 36 | "# 必要ライブラリimport\n", 37 | "import numpy as np\n", 38 | "from sklearn.datasets import load_boston\n", 39 | "\n", 40 | "boston = load_boston()\n", 41 | "x_org, yt = boston.data, boston.target\n", 42 | "feature_names = boston.feature_names\n", 43 | "\n", 44 | "x_data = x_org[:,feature_names == 'RM']\n", 45 | "x = np.insert(x_data, 0, 1.0, axis=1)" 46 | ] 47 | }, 48 | { 49 | "cell_type": "markdown", 50 | "metadata": {}, 51 | "source": [ 52 | "#### 散布図の表示" 53 | ] 54 | }, 55 | { 56 | "cell_type": "code", 57 | "execution_count": 2, 58 | "metadata": {}, 59 | "outputs": [], 60 | "source": [ 61 | "# 必要ライブラリimport\n", 62 | "%matplotlib inline\n", 63 | "import matplotlib.pyplot as plt" 64 | ] 65 | }, 66 | { 67 | "cell_type": "code", 68 | "execution_count": 3, 69 | "metadata": {}, 70 | "outputs": [ 71 | { 72 | "data": { 73 | "image/png": "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\n", 74 | "text/plain": [ 75 | "
" 76 | ] 77 | }, 78 | "metadata": { 79 | "needs_background": "light" 80 | }, 81 | "output_type": "display_data" 82 | } 83 | ], 84 | "source": [ 85 | "# 散布図の表示\n", 86 | "\n", 87 | "# 散布図は scatter関数で表示します。\n", 88 | "# 第一引数 xの値の配列 (例では x[:,1])\n", 89 | "# 第二引数 yの値の配列 (例ではyt)\n", 90 | "# s: 点の大きさ (オプション)\n", 91 | "# c: 色指定 (オプション)\n", 92 | "plt.scatter(x[:,1], yt, s=10, c='b')\n", 93 | "\n", 94 | "# xlabel: x軸のラベル表示\n", 95 | "plt.xlabel('ROOM', fontsize=14)\n", 96 | "\n", 97 | "# ylabel: y軸のラベル表示\n", 98 | "plt.ylabel('PRICE', fontsize=14)\n", 99 | "\n", 100 | "# 画面描画を明示的に指示\n", 101 | "plt.show()" 102 | ] 103 | }, 104 | { 105 | "cell_type": "markdown", 106 | "metadata": {}, 107 | "source": [ 108 | "#### グラフ表示\n", 109 | "7章では学習曲線の表示にplot関数が使われています。 \n", 110 | "学習曲線の計算は大変なので、代わりに5章で出てくるシグモイド関数のグラフ表示コードを示します。" 111 | ] 112 | }, 113 | { 114 | "cell_type": "code", 115 | "execution_count": 4, 116 | "metadata": {}, 117 | "outputs": [], 118 | "source": [ 119 | "# シグモイド関数の定義\n", 120 | "def sigmoid(x):\n", 121 | " return 1/(1 + np.exp(-x))" 122 | ] 123 | }, 124 | { 125 | "cell_type": "code", 126 | "execution_count": 5, 127 | "metadata": {}, 128 | "outputs": [], 129 | "source": [ 130 | "# xの配列作成\n", 131 | "# linescapeは与えられた区間の間に等間隔の点を取る関数です。\n", 132 | "# 下記の例では 区間[-5, 5]の間に101個の点を取ります。\n", 133 | "\n", 134 | "x = np.linspace(-5, 5, 101)" 135 | ] 136 | }, 137 | { 138 | "cell_type": "code", 139 | "execution_count": 6, 140 | "metadata": {}, 141 | "outputs": [ 142 | { 143 | "name": "stdout", 144 | "output_type": "stream", 145 | "text": [ 146 | "[-5. -4.9 -4.8 -4.7 -4.6]\n" 147 | ] 148 | } 149 | ], 150 | "source": [ 151 | "# xの内容表示(一部)\n", 152 | "print(x[:5])" 153 | ] 154 | }, 155 | { 156 | "cell_type": "code", 157 | "execution_count": 7, 158 | "metadata": {}, 159 | "outputs": [], 160 | "source": [ 161 | "# yの配列作成\n", 162 | "y = sigmoid(x)" 163 | ] 164 | }, 165 | { 166 | "cell_type": "code", 167 | "execution_count": 8, 168 | "metadata": {}, 169 | "outputs": [ 170 | { 171 | "name": "stdout", 172 | "output_type": "stream", 173 | "text": [ 174 | "[0.00669285 0.00739154 0.00816257 0.0090133 0.0099518 ]\n" 175 | ] 176 | } 177 | ], 178 | "source": [ 179 | "# yの内容表示(一部)\n", 180 | "print(y[:5])" 181 | ] 182 | }, 183 | { 184 | "cell_type": "code", 185 | "execution_count": 9, 186 | "metadata": {}, 187 | "outputs": [ 188 | { 189 | "data": { 190 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXQAAAD4CAYAAAD8Zh1EAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjAsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+17YcXAAAgAElEQVR4nO3deXiU1cH+8e/JHpKQQAIhhLAvEkBFAsE9WEVEQG3rVrHu+LO11VdxK2qtrbUuXbRaFW1dqkLdxVfcWonyukLYt7CELQQIWQjZJslMzu+PRBpjMAOZ5Jnl/lwXF5mZh5n7ZLk5OfMsxlqLiIgEvjCnA4iIiG+o0EVEgoQKXUQkSKjQRUSChApdRCRIRDj1wikpKXbgwIFOvfwRq66uJi4uzukYXSrUxhxq4wWNOZDk5eWVWGt7tfWYY4U+cOBAli5d6tTLH7Hc3FxycnKcjtGlQm3MoTZe0JgDiTFm+6Ee05KLiEiQUKGLiAQJFbqISJBwbA29LQ0NDRQWFuJyuZyOckiJiYmsX7/e0QwxMTH069ePyMhIR3OIiH9pt9CNMf8ApgHF1trRbTxugEeAqUANcLm1dtmRhCksLCQhIYGBAwfS9LT+p7KykoSEBMde31pLaWkphYWFDBo0yLEcIuJ/vFlyeQ6Y8j2PnwUMa/4zC3jiSMO4XC6Sk5P9tsz9gTGG5ORkv/4tRkSc0W6hW2s/Bcq+Z5NzgBdsky+BJGNM2pEGUpm3T58jEWmLL9bQ04GdLW4XNt+3u/WGxphZNM3iSU1NJTc391uPJyYmUllZ6YNIncfj8fhFRpfL9Z3PX2epqqrqstfyB6E2XtCYfcFaS70Hat2WGje43JZaN7g8FpfbUudp+rjODcf0DmdwYrjPXvsbvij0tqaLbZ5k3Vo7F5gLkJWVZVvv1L9+/XpH16cP5eqrr+amm24iMzOz09bQp06dyssvv0xSUtK37r/nnnuIj49n9uzZ37o/JiaGsWPH+jxHWwL1AIwjFWrjBY25NU+jpbS6jpLKesqq6ymtrqOsup7ymgbKq+spr6mnorbh4J9Kl5sDtQ24G727vsT4MSPImTjAh6Np4otCLwQyWtzuBxT54Hn9xjPPPNPpr7Fw4cJOfw0RgZp6N7vKa1m1z83ur3ewu8LFnopaiivr2Hugjn2VLkqr62nr2j/GQGJsJD26RR38e2ByHImxkSTERJAQE0n32AjioyNIiIkgPjqSblHhxEdHEBcdQbeocGIjwwkL65xlU18U+gLgemPMfCAbqLDWfme5JVBUV1dzwQUXUFhYiMfj4a677uKJJ57g4YcfJisrixdeeIFHHnmEvn37MmzYMKKjo3nssce4/PLLiY2NZcOGDWzfvp1nn32W559/ni+++ILs7Gyee+45AObNm8fvf/97rLWcffbZPPDAA8B/T4WQkpLCfffdxwsvvEBGRga9evVi3LhxDn5GRAKLtZbS6nq2llSztaSabSXV7CirYUdZDTvLaiivafjvxnmrMQZ6xUeT2j2G9KQYjs1IpFd8NL0SokmOjyY5Lork+Ch6dIsiqVsU4Z1Uxr7gzW6L84AcIMUYUwj8GogEsNY+CSykaZfFzTTttniFL4L95p21rCs64IunOiizb3d+PX3U927z/vvv07dvX959910AKioqeOKJph13ioqKePDBB1m+fDkJCQmcdtppHHPMMQf/bXl5OR9//DELFixg+vTpfPbZZzzzzDOMHz+eFStW0Lt3b2677Tby8vLo0aMHkydP5q233uLcc889+Bx5eXnMnz+f5cuX43a7Oe6441ToIodQVl3Pht0H2LCnko17K9lUXMXm4ioqav9b2hFhhvQesfTv2Y3RY9Lo1yOW9KRYirduYOqkE+idEE1keHAcY9luoVtrL27ncQv83GeJHDZmzBhmz57NbbfdxrRp0zj55JMPPvb1119z4okn0rNnTwDOP/98Nm7cePDx6dOnY4xhzJgxpKamMmbMGABGjRrFtm3b2L59Ozk5OfTq1XSitEsuuYRPP/30W4W+ePFizjvvPLp16wbAjBkzOn3MIoGgpKqOFTv2s3pXBWuLKliz6wB7Dvx3990e3SIZlprAtKPTGNIrnkG94hicEkd6UiwRbRR27v5NpCfFduUQOp1fHSnaUnsz6c4yfPhw8vLyWLhwIXfccQeTJ08++Fh7F9SOjo4GICws7ODH39x2u91ERHj36dZuiRLqGhstm4qr+HpbGUu3lbFsRzk7y2qBpnXsIb3iOX5IMplp3TkqLYGj+nSnV0J0O88a/Py20J1SVFREz549mTlzJvHx8QfXvgEmTJjAjTfeSHl5OQkJCbz++usHZ+HeyM7O5oYbbqCkpIQePXowb948fvGLX3xrm1NO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\n", 191 | "text/plain": [ 192 | "
" 193 | ] 194 | }, 195 | "metadata": { 196 | "needs_background": "light" 197 | }, 198 | "output_type": "display_data" 199 | } 200 | ], 201 | "source": [ 202 | "# グラフ表示\n", 203 | "\n", 204 | "# グラフ表示はplot関数で描画する\n", 205 | "# 第一引数: xの配列\n", 206 | "# 第二引数: yの配列\n", 207 | "# label: グラフのラベル指定(オプション)\n", 208 | "plt.plot(x, y, label='sigmoid')\n", 209 | "\n", 210 | "# グラフ上にグリッド表示を追加\n", 211 | "plt.grid()\n", 212 | "\n", 213 | "# グラフ上に凡例表示を追加\n", 214 | "plt.legend()\n", 215 | "\n", 216 | "# 画面描画を明示的に指示\n", 217 | "plt.show()" 218 | ] 219 | }, 220 | { 221 | "cell_type": "code", 222 | "execution_count": null, 223 | "metadata": {}, 224 | "outputs": [], 225 | "source": [] 226 | }, 227 | { 228 | "cell_type": "code", 229 | "execution_count": null, 230 | "metadata": {}, 231 | "outputs": [], 232 | "source": [] 233 | } 234 | ], 235 | "metadata": { 236 | "kernelspec": { 237 | "display_name": "Python 3", 238 | "language": "python", 239 | "name": "python3" 240 | }, 241 | "language_info": { 242 | "codemirror_mode": { 243 | "name": "ipython", 244 | "version": 3 245 | }, 246 | "file_extension": ".py", 247 | "mimetype": "text/x-python", 248 | "name": "python", 249 | "nbconvert_exporter": "python", 250 | "pygments_lexer": "ipython3", 251 | "version": "3.7.3" 252 | } 253 | }, 254 | "nbformat": 4, 255 | "nbformat_minor": 1 256 | } 257 | -------------------------------------------------------------------------------- /notebooks/exams/15-matplotlib-exam.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "## Matplotlib課題" 8 | ] 9 | }, 10 | { 11 | "cell_type": "markdown", 12 | "metadata": {}, 13 | "source": [ 14 | "下記のシグモイド関数グラフ描画のコードを参考にして、sin関数のグラフを描画して下さい。\n", 15 | "但し、xの値域は$[0, 6\\pi]$ とします。" 16 | ] 17 | }, 18 | { 19 | "cell_type": "code", 20 | "execution_count": 1, 21 | "metadata": {}, 22 | "outputs": [], 23 | "source": [ 24 | "# 必要ライブラリimport\n", 25 | "import numpy as np\n", 26 | "%matplotlib inline\n", 27 | "import matplotlib.pyplot as plt" 28 | ] 29 | }, 30 | { 31 | "cell_type": "code", 32 | "execution_count": 2, 33 | "metadata": {}, 34 | "outputs": [ 35 | { 36 | "data": { 37 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXQAAAD4CAYAAAD8Zh1EAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjAsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+17YcXAAAgAElEQVR4nO3deXiU1cH+8e/JHpKQQAIhhLAvEkBFAsE9WEVEQG3rVrHu+LO11VdxK2qtrbUuXbRaFW1dqkLdxVfcWonyukLYt7CELQQIWQjZJslMzu+PRBpjMAOZ5Jnl/lwXF5mZh5n7ZLk5OfMsxlqLiIgEvjCnA4iIiG+o0EVEgoQKXUQkSKjQRUSChApdRCRIRDj1wikpKXbgwIFOvfwRq66uJi4uzukYXSrUxhxq4wWNOZDk5eWVWGt7tfWYY4U+cOBAli5d6tTLH7Hc3FxycnKcjtGlQm3MoTZe0JgDiTFm+6Ee05KLiEiQUKGLiAQJFbqISJBwbA29LQ0NDRQWFuJyuZyOckiJiYmsX7/e0QwxMTH069ePyMhIR3OIiH9pt9CNMf8ApgHF1trRbTxugEeAqUANcLm1dtmRhCksLCQhIYGBAwfS9LT+p7KykoSEBMde31pLaWkphYWFDBo0yLEcIuJ/vFlyeQ6Y8j2PnwUMa/4zC3jiSMO4XC6Sk5P9tsz9gTGG5ORkv/4tRkSc0W6hW2s/Bcq+Z5NzgBdsky+BJGNM2pEGUpm3T58jEWmLL9bQ04GdLW4XNt+3u/WGxphZNM3iSU1NJTc391uPJyYmUllZ6YNIncfj8fhFRpfL9Z3PX2epqqrqstfyB6E2XtCYfcFaS70Hat2WGje43JZaN7g8FpfbUudp+rjODcf0DmdwYrjPXvsbvij0tqaLbZ5k3Vo7F5gLkJWVZVvv1L9+/XpH16cP5eqrr+amm24iMzOz09bQp06dyssvv0xSUtK37r/nnnuIj49n9uzZ37o/JiaGsWPH+jxHWwL1AIwjFWrjBY25NU+jpbS6jpLKesqq6ymtrqOsup7ymgbKq+spr6mnorbh4J9Kl5sDtQ24G727vsT4MSPImTjAh6Np4otCLwQyWtzuBxT54Hn9xjPPPNPpr7Fw4cJOfw0RgZp6N7vKa1m1z83ur3ewu8LFnopaiivr2Hugjn2VLkqr62nr2j/GQGJsJD26RR38e2ByHImxkSTERJAQE0n32AjioyNIiIkgPjqSblHhxEdHEBcdQbeocGIjwwkL65xlU18U+gLgemPMfCAbqLDWfme5JVBUV1dzwQUXUFhYiMfj4a677uKJJ57g4YcfJisrixdeeIFHHnmEvn37MmzYMKKjo3nssce4/PLLiY2NZcOGDWzfvp1nn32W559/ni+++ILs7Gyee+45AObNm8fvf/97rLWcffbZPPDAA8B/T4WQkpLCfffdxwsvvEBGRga9evVi3LhxDn5GRAKLtZbS6nq2llSztaSabSXV7CirYUdZDTvLaiivafjvxnmrMQZ6xUeT2j2G9KQYjs1IpFd8NL0SokmOjyY5Lork+Ch6dIsiqVsU4Z1Uxr7gzW6L84AcIMUYUwj8GogEsNY+CSykaZfFzTTttniFL4L95p21rCs64IunOiizb3d+PX3U927z/vvv07dvX959910AKioqeOKJph13ioqKePDBB1m+fDkJCQmcdtppHHPMMQf/bXl5OR9//DELFixg+vTpfPbZZzzzzDOMHz+eFStW0Lt3b2677Tby8vLo0aMHkydP5q233uLcc889+Bx5eXnMnz+f5cuX43a7Oe6441ToIodQVl3Pht0H2LCnko17K9lUXMXm4ioqav9b2hFhhvQesfTv2Y3RY9Lo1yOW9KRYirduYOqkE+idEE1keHAcY9luoVtrL27ncQv83GeJHDZmzBhmz57NbbfdxrRp0zj55JMPPvb1119z4okn0rNnTwDOP/98Nm7cePDx6dOnY4xhzJgxpKamMmbMGABGjRrFtm3b2L59Ozk5OfTq1XSitEsuuYRPP/30W4W+ePFizjvvPLp16wbAjBkzOn3MIoGgpKqOFTv2s3pXBWuLKliz6wB7Dvx3990e3SIZlprAtKPTGNIrnkG94hicEkd6UiwRbRR27v5NpCfFduUQOp1fHSnaUnsz6c4yfPhw8vLyWLhwIXfccQeTJ08++Fh7F9SOjo4GICws7ODH39x2u91ERHj36dZuiRLqGhstm4qr+HpbGUu3lbFsRzk7y2qBpnXsIb3iOX5IMplp3TkqLYGj+nSnV0J0O88a/Py20J1SVFREz549mTlzJvHx8QfXvgEmTJjAjTfeSHl5OQkJCbz++usHZ+HeyM7O5oYbbqCkpIQePXowb948fvGLX3xrm1NO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\n", 38 | "text/plain": [ 39 | "
" 40 | ] 41 | }, 42 | "metadata": { 43 | "needs_background": "light" 44 | }, 45 | "output_type": "display_data" 46 | } 47 | ], 48 | "source": [ 49 | "def sigmoid(x):\n", 50 | " return 1/(1 + np.exp(-x))\n", 51 | "\n", 52 | "x = np.linspace(-5, 5, 101)\n", 53 | "y = sigmoid(x)\n", 54 | "\n", 55 | "plt.plot(x, y, label='sigmoid')\n", 56 | "plt.grid()\n", 57 | "plt.legend()\n", 58 | "plt.show()" 59 | ] 60 | }, 61 | { 62 | "cell_type": "markdown", 63 | "metadata": {}, 64 | "source": [ 65 | "以下にsin関数のグラフ描画のコードを実装して下さい。\n", 66 | "ヒント:\n", 67 | "sin関数 ``np.sin``\n", 68 | "$\\pi$は、``np.pi``を使って下さい。" 69 | ] 70 | }, 71 | { 72 | "cell_type": "code", 73 | "execution_count": 4, 74 | "metadata": {}, 75 | "outputs": [ 76 | { 77 | "data": { 78 | "image/png": "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\n", 79 | "text/plain": [ 80 | "
" 81 | ] 82 | }, 83 | "metadata": { 84 | "needs_background": "light" 85 | }, 86 | "output_type": "display_data" 87 | } 88 | ], 89 | "source": [] 90 | }, 91 | { 92 | "cell_type": "code", 93 | "execution_count": null, 94 | "metadata": {}, 95 | "outputs": [], 96 | "source": [] 97 | } 98 | ], 99 | "metadata": { 100 | "kernelspec": { 101 | "display_name": "Python 3", 102 | "language": "python", 103 | "name": "python3" 104 | }, 105 | "language_info": { 106 | "codemirror_mode": { 107 | "name": "ipython", 108 | "version": 3 109 | }, 110 | "file_extension": ".py", 111 | "mimetype": "text/x-python", 112 | "name": "python", 113 | "nbconvert_exporter": "python", 114 | "pygments_lexer": "ipython3", 115 | "version": "3.7.3" 116 | } 117 | }, 118 | "nbformat": 4, 119 | "nbformat_minor": 2 120 | } 121 | --------------------------------------------------------------------------------