Skip to content

Instantly share code, notes, and snippets.

@Cartman0
Created April 23, 2016 15:59
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Cartman0/5a813e0eb1ef43c4591727e8574d764a to your computer and use it in GitHub Desktop.
Save Cartman0/5a813e0eb1ef43c4591727e8574d764a to your computer and use it in GitHub Desktop.
NumPy Tutorial メモ6(Linear Algebra)
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"metadata": {
"toc": "true"
},
"cell_type": "markdown",
"source": "# Table of Contents\n <p><div class=\"lev1\"><a href=\"#NumPy-Tutorial-6-1\"><span class=\"toc-item-num\">1&nbsp;&nbsp;</span>NumPy Tutorial 6</a></div><div class=\"lev2\"><a href=\"#Linear-Algebra(線形代数)-1.1\"><span class=\"toc-item-num\">1.1&nbsp;&nbsp;</span>Linear Algebra(線形代数)</a></div><div class=\"lev3\"><a href=\"#Simple-Array-Operations(シンプルな配列演算)-1.1.1\"><span class=\"toc-item-num\">1.1.1&nbsp;&nbsp;</span>Simple Array Operations(シンプルな配列演算)</a></div><div class=\"lev3\"><a href=\"#行列クラス-1.1.2\"><span class=\"toc-item-num\">1.1.2&nbsp;&nbsp;</span>行列クラス</a></div><div class=\"lev3\"><a href=\"#添字アクセス:行列と2次元配列の比較-1.1.3\"><span class=\"toc-item-num\">1.1.3&nbsp;&nbsp;</span>添字アクセス:行列と2次元配列の比較</a></div><div class=\"lev3\"><a href=\"#Vector-Stacking(ベクトルのスタック)-1.1.4\"><span class=\"toc-item-num\">1.1.4&nbsp;&nbsp;</span>Vector Stacking(ベクトルのスタック)</a></div><div class=\"lev3\"><a href=\"#Histograms-1.1.5\"><span class=\"toc-item-num\">1.1.5&nbsp;&nbsp;</span>Histograms</a></div><div class=\"lev2\"><a href=\"#参考リンク-1.2\"><span class=\"toc-item-num\">1.2&nbsp;&nbsp;</span>参考リンク</a></div>"
},
{
"metadata": {},
"cell_type": "markdown",
"source": "# NumPy Tutorial 6"
},
{
"metadata": {},
"cell_type": "markdown",
"source": "- [NumPy Tutorial メモ1(Basic)](http://nbviewer.jupyter.org/gist/Cartman0/9fa48b89664dc08ef82a55877767b5a0)\n- [NumPy Tutorial メモ2(ShapeManipulation)](http://nbviewer.jupyter.org/gist/Cartman0/bc062d1a162589e40a02c21e0ada7776)\n- [NumPy Tutorial メモ3(Copies and Views)](http://nbviewer.jupyter.org/gist/Cartman0/cd39c1bfc88f5edccd8f4523fbd33b91)\n- [NumPy Tutorial メモ4(Less Basic)](http://nbviewer.jupyter.org/gist/Cartman0/e9f50b0f0dbc28f40938b11088ac211d)\n- [NumPy Tutorial メモ5(Fancy indexing and index tricks)](http://nbviewer.jupyter.org/gist/Cartman0/5d24bdc3234a97bfc7c9fed4355a1580)"
},
{
"metadata": {},
"cell_type": "markdown",
"source": "## Linear Algebra(線形代数)"
},
{
"metadata": {},
"cell_type": "markdown",
"source": "Work in progress. \nBasic linear algebra to be included here.\n(基礎の線形代数がここに含まれる。)"
},
{
"metadata": {},
"cell_type": "markdown",
"source": "### Simple Array Operations(シンプルな配列演算)"
},
{
"metadata": {},
"cell_type": "markdown",
"source": "See `linalg.py` in numpy folder for more."
},
{
"metadata": {
"collapsed": false,
"trusted": true
},
"cell_type": "code",
"source": "import numpy as np\na = np.array([\n [1.0, 2.0], \n [3.0, 4.0]\n ])\nprint(a)",
"execution_count": 1,
"outputs": [
{
"output_type": "stream",
"text": "[[ 1. 2.]\n [ 3. 4.]]\n",
"name": "stdout"
}
]
},
{
"metadata": {
"collapsed": false,
"trusted": true
},
"cell_type": "code",
"source": "a.transpose() # 転置",
"execution_count": 2,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": "array([[ 1., 3.],\n [ 2., 4.]])"
},
"metadata": {},
"execution_count": 2
}
]
},
{
"metadata": {
"collapsed": false,
"trusted": true
},
"cell_type": "code",
"source": "a.transpose() == a.T # Tも同じ",
"execution_count": 3,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": "array([[ True, True],\n [ True, True]], dtype=bool)"
},
"metadata": {},
"execution_count": 3
}
]
},
{
"metadata": {
"collapsed": false,
"trusted": true
},
"cell_type": "code",
"source": "np.linalg.inv(a) # 逆行列",
"execution_count": 4,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": "array([[-2. , 1. ],\n [ 1.5, -0.5]])"
},
"metadata": {},
"execution_count": 4
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "$$\nA * A^{-1} = I\n$$\n\n$\nA = \\left(\n \\begin{array}{cc}\n a & b \\\\\n c & d \n \\end{array}\n \\right)\n$ , $\nA^{-1} = \\left(\n \\begin{array}{cc}\n a^{-1} & b^{-1} \\\\\n c^{-1} & d^{-1} \n \\end{array}\n \\right)\n$ として、\n\n$$\n\\left(\n \\begin{array}{cc}\n a & b \\\\\n c & d \n \\end{array}\n \\right) \n \\left(\n \\begin{array}{cc}\n a^{-1} & b^{-1} \\\\\n c^{-1} & d^{-1} \n \\end{array}\n \\right)\n = \n \\left(\n \\begin{array}{cc}\n 1 & 0 \\\\\n 0 & 1 \n \\end{array}\n \\right)\n$$\n\n\\begin{eqnarray}\na * a^{-1} + b * c{^-1} = 1\\\\\na * b^{-1} + b * d^{-1} = 0\\\\\nc * a^{-1} + d * c^{-1} = 0\\\\\nc * b^{-1} + d * d^{-1} = 1\\\\\n\\end{eqnarray}\n\n$$\nc * a^{-1} + d * c^{-1} = 0 \\\\\nc^{-1} = - \\frac{c*a^{-1}}{d}\n$$\n\n\\begin{eqnarray}\na * a^{-1} + b * c{^-1} &=& 1 \\\\\na * a^{-1} - b * \\frac{c*a^{-1}}{d} &=& 1 \\\\\n(a - \\frac{bc}{d})a^{-1} &=&1\\\\\na^{-1} &=& \\frac{1}{(a - \\frac{bc}{d})}\\\\\n&=& \\frac{d}{(ad - bc)}\\\\\n\\end{eqnarray}\n\n\\begin{eqnarray}\nc^{-1} &=& - \\frac{c}{d}*\\frac{d}{(ad - bc)}\\\\\n&=& - \\frac{c}{(ad - bc)}\\\\\n\\end{eqnarray}\n\n\\begin{eqnarray}\nc^{-1} &=& - \\frac{c}{d}*\\frac{d}{(ad - bc)}\\\\\n&=& - \\frac{c}{(ad - bc)}\\\\\n\\end{eqnarray}\n\n\\begin{eqnarray}\na * b^{-1} + b * d^{-1} &=& 0 \\\\\nd^{-1} &=& -\\frac{a * b^{-1}}{b}\n\\end{eqnarray}\n\n\\begin{eqnarray}\nc * b^{-1} + d * d^{-1} &=& 1 \\\\\nc * b^{-1} + d * -\\frac{a * b^{-1}}{b} &=& 1 \\\\\n(c - d\\frac{a}{b})b^{-1} &=& 1\\\\\nb^{-1} &=& - \\frac{1}{d\\frac{a}{b} - c}\\\\\n &=& - \\frac{b}{ad - bc}\n\\end{eqnarray}\n\n\\begin{eqnarray}\nd^{-1} &=& -\\frac{a * b^{-1}}{b}\\\\\n&=& -\\frac{a}{b} * - \\frac{b}{ad - bc}\\\\\n&=& \\frac{a}{ad - bc}\\\\\n\\end{eqnarray}\n\n$$\nA^{-1} = \\frac{1}{ad-bc} \\left(\n \\begin{array}{cc}\n d & -b \\\\\n -c & a \n \\end{array}\n \\right)\n$$"
},
{
"metadata": {
"collapsed": false,
"trusted": true
},
"cell_type": "code",
"source": "u = np.eye(2) # unit 2x2 matrix; \"eye\" represents \"I\" 単位行列\nu",
"execution_count": 5,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": "array([[ 1., 0.],\n [ 0., 1.]])"
},
"metadata": {},
"execution_count": 5
}
]
},
{
"metadata": {
"collapsed": false,
"trusted": true
},
"cell_type": "code",
"source": "j = np.array([\n [0.0, -1.0], \n [1.0, 0.0]\n ])\nj",
"execution_count": 6,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": "array([[ 0., -1.],\n [ 1., 0.]])"
},
"metadata": {},
"execution_count": 6
}
]
},
{
"metadata": {
"collapsed": false,
"trusted": true
},
"cell_type": "code",
"source": "np.dot(j, j) # matrix product",
"execution_count": 7,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": "array([[-1., 0.],\n [ 0., -1.]])"
},
"metadata": {},
"execution_count": 7
}
]
},
{
"metadata": {
"collapsed": false,
"trusted": true
},
"cell_type": "code",
"source": "j.dot(j)",
"execution_count": 8,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": "array([[-1., 0.],\n [ 0., -1.]])"
},
"metadata": {},
"execution_count": 8
}
]
},
{
"metadata": {
"collapsed": false,
"trusted": true
},
"cell_type": "code",
"source": "np.trace(u) # trace",
"execution_count": 9,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": "2.0"
},
"metadata": {},
"execution_count": 9
}
]
},
{
"metadata": {
"collapsed": false,
"trusted": true
},
"cell_type": "code",
"source": "y = np.array([\n [5.], \n [7.]\n ])\ny",
"execution_count": 10,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": "array([[ 5.],\n [ 7.]])"
},
"metadata": {},
"execution_count": 10
}
]
},
{
"metadata": {
"collapsed": false,
"trusted": true
},
"cell_type": "code",
"source": "np.linalg.solve(a, y) # 2元連立方程式 A^-1 * y",
"execution_count": 11,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": "array([[-3.],\n [ 4.]])"
},
"metadata": {},
"execution_count": 11
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "固有値の計算\n\nhttp://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.linalg.eig.html"
},
{
"metadata": {
"collapsed": false,
"scrolled": false,
"trusted": true
},
"cell_type": "code",
"source": "eig_val, eig_vec = np.linalg.eig(j)\neig_val, eig_vec",
"execution_count": 12,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": "(array([ 0.+1.j, 0.-1.j]),\n array([[ 0.70710678+0.j , 0.70710678-0.j ],\n [ 0.00000000-0.70710678j, 0.00000000+0.70710678j]]))"
},
"metadata": {},
"execution_count": 12
}
]
},
{
"metadata": {
"collapsed": false
},
"cell_type": "markdown",
"source": "### 行列クラス"
},
{
"metadata": {},
"cell_type": "markdown",
"source": "[numpy.matrix](http://docs.scipy.org/doc/numpy-1.10.1/reference/generated/numpy.matrix.html)"
},
{
"metadata": {
"collapsed": false,
"trusted": true
},
"cell_type": "code",
"source": "A = np.matrix('1.0 2.0; 3.0 4.0')\nA",
"execution_count": 13,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": "matrix([[ 1., 2.],\n [ 3., 4.]])"
},
"metadata": {},
"execution_count": 13
}
]
},
{
"metadata": {
"collapsed": false,
"trusted": true
},
"cell_type": "code",
"source": "type(A) # クラスを定義しているファイル",
"execution_count": 14,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": "numpy.matrixlib.defmatrix.matrix"
},
"metadata": {},
"execution_count": 14
}
]
},
{
"metadata": {
"collapsed": false,
"trusted": true
},
"cell_type": "code",
"source": "A.T # 転置",
"execution_count": 15,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": "matrix([[ 1., 3.],\n [ 2., 4.]])"
},
"metadata": {},
"execution_count": 15
}
]
},
{
"metadata": {
"collapsed": false,
"trusted": true
},
"cell_type": "code",
"source": "X = np.matrix('5.0 7.0')\nX",
"execution_count": 16,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": "matrix([[ 5., 7.]])"
},
"metadata": {},
"execution_count": 16
}
]
},
{
"metadata": {
"collapsed": false,
"trusted": true
},
"cell_type": "code",
"source": "Y = X.T\nY",
"execution_count": 17,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": "matrix([[ 5.],\n [ 7.]])"
},
"metadata": {},
"execution_count": 17
}
]
},
{
"metadata": {
"collapsed": false,
"trusted": true
},
"cell_type": "code",
"source": "print(A * Y) # 行列の乗算",
"execution_count": 18,
"outputs": [
{
"output_type": "stream",
"text": "[[ 19.]\n [ 43.]]\n",
"name": "stdout"
}
]
},
{
"metadata": {
"collapsed": false,
"trusted": true
},
"cell_type": "code",
"source": "print(A.I) # 逆行列",
"execution_count": 19,
"outputs": [
{
"output_type": "stream",
"text": "[[-2. 1. ]\n [ 1.5 -0.5]]\n",
"name": "stdout"
}
]
},
{
"metadata": {
"collapsed": false,
"trusted": true
},
"cell_type": "code",
"source": "np.linalg.solve(A, Y) # 線形方程式を解く",
"execution_count": 20,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": "matrix([[-3.],\n [ 4.]])"
},
"metadata": {},
"execution_count": 20
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "### 添字アクセス:行列と2次元配列の比較"
},
{
"metadata": {},
"cell_type": "markdown",
"source": "NumPy の配列と行列の間にはいくつかの重要な差異があることに注意。\n\nNumPy は、\n- N次元配列オブジェクトと\n- ユニバーサル関数オブジェクト\n\nという2種類の基本的なオブジェクトを用意している。\nその他のオブジェクトはこれら2つの上に構築されている。\n\n特に、行列はNumPyのarrayオブジェクトを継承した2次元配列オブジェクトである。\n配列も行列も、添字は以下の1つもしくは複数の適切な組み合わせで構成されていなければならない:整数スカラー値、省略記号、整数または真偽値のリスト、整数または真偽値のタプル、整数または真偽値の1次元配列。\n行列を行列のindex として用いることもできるが、普通は配列、リスト、あるいは他の形で事が足りる。\nPythonでもそうであるように、index は0ベースである。\n伝統的に我々は2次元配列や行列を行と列の長方形の配列として表す。\n軸0に沿った動きは行を横切り、軸1に沿った動きは列を横切る。"
},
{
"metadata": {
"collapsed": false,
"trusted": true
},
"cell_type": "code",
"source": "A = np.arange(12)\nA",
"execution_count": 21,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": "array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])"
},
"metadata": {},
"execution_count": 21
}
]
},
{
"metadata": {
"collapsed": false,
"trusted": true
},
"cell_type": "code",
"source": "A.shape = (3,4)\nA",
"execution_count": 22,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": "array([[ 0, 1, 2, 3],\n [ 4, 5, 6, 7],\n [ 8, 9, 10, 11]])"
},
"metadata": {},
"execution_count": 22
}
]
},
{
"metadata": {
"collapsed": false,
"trusted": true
},
"cell_type": "code",
"source": "M = np.mat(A.copy())\nM",
"execution_count": 23,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": "matrix([[ 0, 1, 2, 3],\n [ 4, 5, 6, 7],\n [ 8, 9, 10, 11]])"
},
"metadata": {},
"execution_count": 23
}
]
},
{
"metadata": {
"collapsed": false,
"trusted": true
},
"cell_type": "code",
"source": "print(type(A), ' ', type(M))",
"execution_count": 24,
"outputs": [
{
"output_type": "stream",
"text": "<class 'numpy.ndarray'> <class 'numpy.matrixlib.defmatrix.matrix'>\n",
"name": "stdout"
}
]
},
{
"metadata": {
"collapsed": false,
"trusted": true
},
"cell_type": "code",
"source": "print(A)",
"execution_count": 25,
"outputs": [
{
"output_type": "stream",
"text": "[[ 0 1 2 3]\n [ 4 5 6 7]\n [ 8 9 10 11]]\n",
"name": "stdout"
}
]
},
{
"metadata": {
"collapsed": false,
"trusted": true
},
"cell_type": "code",
"source": "print(M)",
"execution_count": 26,
"outputs": [
{
"output_type": "stream",
"text": "[[ 0 1 2 3]\n [ 4 5 6 7]\n [ 8 9 10 11]]\n",
"name": "stdout"
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "ここで、いくつか単純なスライスを取ってみる。\n基本的なスライシングにはスライスオブジェクトまたは整数の組を用いる。\n\n例えば、`A[:]` と `M[:]` の評価はPython の index付けに似たものに見えるのだが、重要なのはNumPy配列のスライシングはデータをコピーしないという点である。\nスライシングは同じデータに対し新しいview を提供する。"
},
{
"metadata": {
"collapsed": false,
"trusted": true
},
"cell_type": "code",
"source": "print(A[:])",
"execution_count": 27,
"outputs": [
{
"output_type": "stream",
"text": "[[ 0 1 2 3]\n [ 4 5 6 7]\n [ 8 9 10 11]]\n",
"name": "stdout"
}
]
},
{
"metadata": {
"collapsed": false,
"trusted": true
},
"cell_type": "code",
"source": "print(A[:].shape)",
"execution_count": 28,
"outputs": [
{
"output_type": "stream",
"text": "(3, 4)\n",
"name": "stdout"
}
]
},
{
"metadata": {
"collapsed": false,
"trusted": true
},
"cell_type": "code",
"source": "print(M[:]) ",
"execution_count": 29,
"outputs": [
{
"output_type": "stream",
"text": "[[ 0 1 2 3]\n [ 4 5 6 7]\n [ 8 9 10 11]]\n",
"name": "stdout"
}
]
},
{
"metadata": {
"collapsed": false,
"trusted": true
},
"cell_type": "code",
"source": "print(M[:].shape)",
"execution_count": 30,
"outputs": [
{
"output_type": "stream",
"text": "(3, 4)\n",
"name": "stdout"
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "Python のindex付けと異なるが、\n複数の軸に沿って同時にindex付けする場合にカンマ区切りのindex が使える。"
},
{
"metadata": {
"collapsed": false,
"trusted": true
},
"cell_type": "code",
"source": "print(A[:, 1])",
"execution_count": 31,
"outputs": [
{
"output_type": "stream",
"text": "[1 5 9]\n",
"name": "stdout"
}
]
},
{
"metadata": {
"collapsed": false,
"trusted": true
},
"cell_type": "code",
"source": "print(A[:, 1].shape)",
"execution_count": 32,
"outputs": [
{
"output_type": "stream",
"text": "(3,)\n",
"name": "stdout"
}
]
},
{
"metadata": {
"collapsed": false,
"trusted": true
},
"cell_type": "code",
"source": "print(M[:, 1])",
"execution_count": 33,
"outputs": [
{
"output_type": "stream",
"text": "[[1]\n [5]\n [9]]\n",
"name": "stdout"
}
]
},
{
"metadata": {
"collapsed": false,
"trusted": true
},
"cell_type": "code",
"source": "print(M[:, 1].shape)",
"execution_count": 34,
"outputs": [
{
"output_type": "stream",
"text": "(3, 1)\n",
"name": "stdout"
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "最後の2つの結果は異なる。\n- 2次元配列に対しコロンを1つ使うと1次元配列ができる\n- 一方、行列に対してだと2次元行列ができる。\n\n行列のスライスは常に行列を生み出す。\n例えばスライス `M[2, :]` は `shape (1, 4)` の行列になるが、\n対照的に、配列のスライスは常に可能な限り一番低い次元の配列になる。\n\n例えば `C` が3次元配列だとすると、\n- `C[..., 1]` は2次元配列に、\n- `C[1, :, 1]` は1次元配列になる。"
},
{
"metadata": {},
"cell_type": "markdown",
"source": "配列の1番目と3番目の列が欲しいとしよう。\nリストを使ってスライスするのが1つの方法である:"
},
{
"metadata": {
"collapsed": false,
"trusted": true
},
"cell_type": "code",
"source": "A",
"execution_count": 35,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": "array([[ 0, 1, 2, 3],\n [ 4, 5, 6, 7],\n [ 8, 9, 10, 11]])"
},
"metadata": {},
"execution_count": 35
}
]
},
{
"metadata": {
"collapsed": false,
"trusted": true
},
"cell_type": "code",
"source": "A[:, [1, 3]]",
"execution_count": 36,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": "array([[ 1, 3],\n [ 5, 7],\n [ 9, 11]])"
},
"metadata": {},
"execution_count": 36
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "`take()` メソッドを使うというのもある:"
},
{
"metadata": {
"collapsed": false,
"trusted": true
},
"cell_type": "code",
"source": "A.take([1, 3], axis=1)",
"execution_count": 37,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": "array([[ 1, 3],\n [ 5, 7],\n [ 9, 11]])"
},
"metadata": {},
"execution_count": 37
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "最初の行(第0軸の0番目)を飛ばしたいなら以下のようになる:"
},
{
"metadata": {
"collapsed": false,
"trusted": true
},
"cell_type": "code",
"source": "A[1:,].take([1, 3], axis=1)",
"execution_count": 38,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": "array([[ 5, 7],\n [ 9, 11]])"
},
"metadata": {},
"execution_count": 38
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "あるいは単に `A[1:, [1, 3]]` としてもよい。\n上のをスライスするもう1つの方法は、`numpy.ix_` の利用がある:"
},
{
"metadata": {
"collapsed": false,
"trusted": true
},
"cell_type": "code",
"source": "np.ix_((1, 2), (1, 3))",
"execution_count": 39,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": "(array([[1],\n [2]]), array([[1, 3]]))"
},
"metadata": {},
"execution_count": 39
}
]
},
{
"metadata": {
"collapsed": false,
"trusted": true
},
"cell_type": "code",
"source": "A",
"execution_count": 40,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": "array([[ 0, 1, 2, 3],\n [ 4, 5, 6, 7],\n [ 8, 9, 10, 11]])"
},
"metadata": {},
"execution_count": 40
}
]
},
{
"metadata": {
"collapsed": false,
"trusted": true
},
"cell_type": "code",
"source": "A[np.ix_((1, 2), (1, 3))]",
"execution_count": 41,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": "array([[ 5, 7],\n [ 9, 11]])"
},
"metadata": {},
"execution_count": 41
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "1行目が1より大きい全ての列を保持したいととする。\nまずは真偽値のindex を作る方法:"
},
{
"metadata": {
"collapsed": false,
"trusted": true
},
"cell_type": "code",
"source": "A[0, :] > 1",
"execution_count": 42,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": "array([False, False, True, True], dtype=bool)"
},
"metadata": {},
"execution_count": 42
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "しかし行列をindex付けするのはあまり便利ではない。"
},
{
"metadata": {
"collapsed": false,
"trusted": true
},
"cell_type": "code",
"source": "M[0, :] > 1",
"execution_count": 43,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": "matrix([[False, False, True, True]], dtype=bool)"
},
"metadata": {},
"execution_count": 43
}
]
},
{
"metadata": {
"collapsed": false,
"scrolled": true,
"trusted": true
},
"cell_type": "code",
"source": "M[:, M[0, :] > 1]",
"execution_count": 44,
"outputs": [
{
"output_type": "error",
"ename": "IndexError",
"evalue": "too many indices for array",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mIndexError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<ipython-input-44-d1c10536344f>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mM\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mM\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m:\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m>\u001b[0m \u001b[1;36m1\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[1;32mC:\\Miniconda3\\lib\\site-packages\\numpy\\matrixlib\\defmatrix.py\u001b[0m in \u001b[0;36m__getitem__\u001b[1;34m(self, index)\u001b[0m\n\u001b[0;32m 316\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 317\u001b[0m \u001b[1;32mtry\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 318\u001b[1;33m \u001b[0mout\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mN\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mndarray\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m__getitem__\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mindex\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 319\u001b[0m \u001b[1;32mfinally\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 320\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_getitem\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;32mFalse\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;31mIndexError\u001b[0m: too many indices for array"
]
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "問題としているのは、行列スライスをスライスすることで行列が生成されてしまう点である。\nしかし行列には便利な'A'属性があって、この値はその行列の配列表現になっているので、代わりにこうするだけで良い:"
},
{
"metadata": {
"collapsed": false,
"trusted": true
},
"cell_type": "code",
"source": "M[:, M.A[0, :] > 1]",
"execution_count": 45,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": "matrix([[ 2, 3],\n [ 6, 7],\n [10, 11]])"
},
"metadata": {},
"execution_count": 45
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "行列を条件によって2つの方向にスライスしたいのであれば、\n戦略をわずかに補正しなければならない。"
},
{
"metadata": {
"collapsed": false,
"trusted": true
},
"cell_type": "code",
"source": "A",
"execution_count": 46,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": "array([[ 0, 1, 2, 3],\n [ 4, 5, 6, 7],\n [ 8, 9, 10, 11]])"
},
"metadata": {},
"execution_count": 46
}
]
},
{
"metadata": {
"collapsed": false,
"trusted": true
},
"cell_type": "code",
"source": "A[:, 0] > 2",
"execution_count": 47,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": "array([False, True, True], dtype=bool)"
},
"metadata": {},
"execution_count": 47
}
]
},
{
"metadata": {
"collapsed": false,
"trusted": true
},
"cell_type": "code",
"source": "A[0, :] > 1",
"execution_count": 48,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": "array([False, False, True, True], dtype=bool)"
},
"metadata": {},
"execution_count": 48
}
]
},
{
"metadata": {
"collapsed": false,
"scrolled": true,
"trusted": true
},
"cell_type": "code",
"source": "A[A[:, 0] > 2, A[0, :] > 1]",
"execution_count": 49,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": "array([ 6, 11])"
},
"metadata": {},
"execution_count": 49
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "の代わりに、外積 `'ix_'` を用いる:"
},
{
"metadata": {
"collapsed": false,
"trusted": true
},
"cell_type": "code",
"source": "np.ix_(A[:, 0] > 2, A[0, :] > 1)",
"execution_count": 50,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": "(array([[1],\n [2]], dtype=int64), array([[2, 3]], dtype=int64))"
},
"metadata": {},
"execution_count": 50
}
]
},
{
"metadata": {
"collapsed": false,
"scrolled": true,
"trusted": true
},
"cell_type": "code",
"source": "A[np.ix_(A[:, 0] > 2, A[0, :] > 1)]",
"execution_count": 51,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": "array([[ 6, 7],\n [10, 11]])"
},
"metadata": {},
"execution_count": 51
}
]
},
{
"metadata": {
"collapsed": false,
"trusted": true
},
"cell_type": "code",
"source": "M[np.ix_(M.A[:, 0] > 2, M.A[0, :] > 1)]",
"execution_count": 52,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": "matrix([[ 6, 7],\n [10, 11]])"
},
"metadata": {},
"execution_count": 52
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "### Vector Stacking(ベクトルのスタック)"
},
{
"metadata": {},
"cell_type": "markdown",
"source": "How do we construct a 2D array from a list of equally-sized row vectors? \n(サイズの等しい行ベクトルのリストから2次元配列を構築するにはどうするか?)\n\nIn MATLAB this is quite easy(MATLABではこれはとても簡単):\nif `x` and `y` are two vectors of the same length you only need do `m = [x; y]`. \n(`x` と `y` の2つが同じ長さのベクトルなら、`m=[x;y]` とするだけで良い。)\n\nIn NumPy this works via the functions `column_stack`, \n`dstack`, `hstack` and `vstack`, \ndepending on the dimension in which the stacking is to be done. \n(NumPyでは、関数 `column_stack`, `dstack`, `hstack`, `vstack` で同じことができる、\n関数の選択はスタックが行われる次元に依存する。)\n\nFor example:"
},
{
"metadata": {
"collapsed": true,
"trusted": true
},
"cell_type": "code",
"source": "x = np.arange(0, 10, 2) # x=([0,2,4,6,8])\ny = np.arange(5)# y=([0,1,2,3,4])",
"execution_count": 53,
"outputs": []
},
{
"metadata": {
"collapsed": false,
"trusted": true
},
"cell_type": "code",
"source": "m = np.vstack([x, y]) # m=([[0,2,4,6,8],\nm # [0,1,2,3,4]]), 2 * 5",
"execution_count": 54,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": "array([[0, 2, 4, 6, 8],\n [0, 1, 2, 3, 4]])"
},
"metadata": {},
"execution_count": 54
}
]
},
{
"metadata": {
"collapsed": false,
"trusted": true
},
"cell_type": "code",
"source": "m.shape",
"execution_count": 55,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": "(2, 5)"
},
"metadata": {},
"execution_count": 55
}
]
},
{
"metadata": {
"collapsed": false,
"trusted": true
},
"cell_type": "code",
"source": "xy = np.hstack([x, y]) # xy =([0,2,4,6,8,0,1,2,3,4]) # 1 * 10\nxy",
"execution_count": 56,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": "array([0, 2, 4, 6, 8, 0, 1, 2, 3, 4])"
},
"metadata": {},
"execution_count": 56
}
]
},
{
"metadata": {
"collapsed": false,
"trusted": true
},
"cell_type": "code",
"source": "xy.shape",
"execution_count": 57,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": "(10,)"
},
"metadata": {},
"execution_count": 57
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "See alse:\n\n- [Numpy for Matlab users](https://docs.scipy.org/doc/numpy-dev/user/numpy-for-matlab-users.html)"
},
{
"metadata": {},
"cell_type": "markdown",
"source": "### Histograms"
},
{
"metadata": {},
"cell_type": "markdown",
"source": "The NumPy `histogram` function applied to an array returns a pair of vectors(NumPy の`histogram`関数は、2つのベクトルを返す配列に適用される): \nthe histogram of the array and the vector of bins. \n(配列のヒストグラムと、瓶(bins)のベクトル、が返ってくる。)\n\nBeware: `matplotlib` also has a function to build histograms (called `hist`, as in Matlab) that differs from the one in NumPy. \n(注意:`matplotlib` にもヒストグラムを構築する関数がある\n(Matlabと同様 hist と呼ばれる)が、NumPyのものとは異なる。)\n\nThe main difference is that `pylab.hist` plots the histogram automatically, \nwhile `numpy.histogram` only generates the data.\n(主な違いは、`pylab.hist` はヒストグラムを自動的に描画するが、\n`numpy.histogram` はデータを生成するところまでしか行わない点である。"
},
{
"metadata": {
"collapsed": false,
"trusted": true
},
"cell_type": "code",
"source": "import numpy as np\nimport matplotlib.pyplot as plt\n%matplotlib inline\n\n# Build a vector of 10000 normal deviates with variance 0.5^2 and mean 2\n\n(mu, sigma) = 2, 0.5\nv = np.random.normal(mu, sigma, 10000)\n# Plot a normalized histogram with 50 bins\nplt.hist(v, bins=50, normed=1) # matplotlib version (plot)\nplt.show()",
"execution_count": 58,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": "<matplotlib.figure.Figure at 0x25ab9ec54e0>",
"image/png": "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\n"
},
"metadata": {}
}
]
},
{
"metadata": {
"collapsed": false,
"trusted": true
},
"cell_type": "code",
"source": "%matplotlib inline\n\n# Compute the histogram with numpy and then plot it\n(n, bins) = np.histogram(v, bins=50, normed=True) # NumPy version (no plot)\nprint('n ', n)\nprint('bins', bins)\nprint('bins[:-1]', bins[:-1])\nplt.plot(.5 * (bins[:-1] + bins[1:]), n)",
"execution_count": 59,
"outputs": [
{
"output_type": "stream",
"text": "n [ 0.00547374 0.00136843 0.00547374 0.01231591 0.01505278 0.02326339\n 0.02189496 0.04242148 0.0547374 0.07526392 0.09305357 0.16284375\n 0.17379123 0.21073898 0.28052916 0.31337159 0.41874108 0.56926892\n 0.57611109 0.66505936 0.70748085 0.72663893 0.77453416 0.69242806\n 0.81969251 0.79779755 0.73484954 0.75400763 0.69242806 0.56653205\n 0.54053179 0.43242543 0.36810899 0.31200316 0.25452889 0.20115993\n 0.17515967 0.12042227 0.07526392 0.07115862 0.05063209 0.03421087\n 0.01778965 0.01505278 0.01505278 0. 0.00136843 0.00821061\n 0.00273687 0.00136843]\nbins [ 0.22548126 0.29855745 0.37163363 0.44470981 0.517786 0.59086218\n 0.66393836 0.73701455 0.81009073 0.88316691 0.9562431 1.02931928\n 1.10239546 1.17547165 1.24854783 1.32162401 1.3947002 1.46777638\n 1.54085256 1.61392875 1.68700493 1.76008111 1.8331573 1.90623348\n 1.97930966 2.05238585 2.12546203 2.19853821 2.2716144 2.34469058\n 2.41776676 2.49084295 2.56391913 2.63699531 2.7100715 2.78314768\n 2.85622386 2.92930005 3.00237623 3.07545241 3.1485286 3.22160478\n 3.29468096 3.36775715 3.44083333 3.51390951 3.5869857 3.66006188\n 3.73313806 3.80621425 3.87929043]\nbins[:-1] [ 0.22548126 0.29855745 0.37163363 0.44470981 0.517786 0.59086218\n 0.66393836 0.73701455 0.81009073 0.88316691 0.9562431 1.02931928\n 1.10239546 1.17547165 1.24854783 1.32162401 1.3947002 1.46777638\n 1.54085256 1.61392875 1.68700493 1.76008111 1.8331573 1.90623348\n 1.97930966 2.05238585 2.12546203 2.19853821 2.2716144 2.34469058\n 2.41776676 2.49084295 2.56391913 2.63699531 2.7100715 2.78314768\n 2.85622386 2.92930005 3.00237623 3.07545241 3.1485286 3.22160478\n 3.29468096 3.36775715 3.44083333 3.51390951 3.5869857 3.66006188\n 3.73313806 3.80621425]\n",
"name": "stdout"
},
{
"output_type": "execute_result",
"data": {
"text/plain": "[<matplotlib.lines.Line2D at 0x25abbc7f780>]"
},
"metadata": {},
"execution_count": 59
},
{
"output_type": "display_data",
"data": {
"text/plain": "<matplotlib.figure.Figure at 0x25abba57f98>",
"image/png": "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\n"
},
"metadata": {}
}
]
},
{
"metadata": {
"collapsed": true
},
"cell_type": "markdown",
"source": "## 参考リンク"
},
{
"metadata": {},
"cell_type": "markdown",
"source": "- [QuickStartTutorial](https://docs.scipy.org/doc/numpy-dev/user/quickstart.html)\n- [私訳「暫定的 NumPy チュートリアル」](http://naoyat.hatenablog.jp/entry/2011/12/29/021414)"
}
],
"metadata": {
"hide_input": false,
"kernelspec": {
"name": "python3",
"display_name": "Python 3",
"language": "python"
},
"language_info": {
"name": "python",
"mimetype": "text/x-python",
"nbconvert_exporter": "python",
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"pygments_lexer": "ipython3",
"file_extension": ".py",
"version": "3.5.1"
},
"toc": {
"toc_window_display": false,
"toc_cell": true,
"toc_number_sections": true,
"toc_threshold": "6"
},
"gist": {
"id": "",
"data": {
"description": "NumPy Tutorial メモ6(Linear Algebra)",
"public": true
}
}
},
"nbformat": 4,
"nbformat_minor": 0
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment