{
  "cells": [
    {
      "cell_type": "code",
      "source": [
        "!date\n",
        "!python --version"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "Sv2PU__-sqC2",
        "outputId": "53fe1ec3-2a4e-41a7-c4bc-f8d9bbed9434"
      },
      "execution_count": 1,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Fri Apr 25 02:07:59 AM UTC 2025\n",
            "Python 3.11.12\n"
          ]
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "更新履歴\n",
        "- 2025年4月25日: 1次元配列の注意を追加。"
      ],
      "metadata": {
        "id": "oNj-A2e7sroH"
      }
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "zOyOW4RvNkN6"
      },
      "source": [
        "# numpy入門"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "tEVLu5LDf59P"
      },
      "source": [
        "## 達成目標\n",
        "基本的な行列作成、演算、列参照できるようになろう。\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "3-90Fe2lgFmJ"
      },
      "source": [
        "## 参考サイト\n",
        "- [Numpy公式チュートリアル](https://numpy.org/doc/stable/user/quickstart.html)\n",
        "- [NumPy Cheat Sheet: Data Analysis in Python](https://www.datacamp.com/blog/numpy-cheat-sheet-data-analysis-in-python)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "4DIvJWJXjL20"
      },
      "source": [
        "## チュートリアル"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 2,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "aGXTMMs8NgxS",
        "outputId": "1a448721-d6d2-4653-a1e0-77866ff91064"
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "[[1 2 3]\n",
            " [4 5 6]]\n",
            "<class 'numpy.ndarray'>\n",
            "(2, 3)\n"
          ]
        }
      ],
      "source": [
        "import numpy as np\n",
        "\n",
        "# 行列の作成\n",
        "a = np.array([[1,2,3], [4,5,6]])\n",
        "print(a)\n",
        "print(type(a))\n",
        "print(a.shape)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 3,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "b4AnjxZVPkW9",
        "outputId": "4992e832-c5df-4dfb-c79a-d5b6b0d797e1"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "array([1, 2, 3])"
            ]
          },
          "metadata": {},
          "execution_count": 3
        }
      ],
      "source": [
        "#行の参照\n",
        "a[0]"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "f5WTu5vsPoaM",
        "outputId": "1ebe8cf4-afe3-4afe-f416-a2c9cacbb8e0"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "array([1, 4])"
            ]
          },
          "metadata": {},
          "execution_count": 4
        }
      ],
      "source": [
        "#列の参照\n",
        "a[:,0]"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 5,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "ioebfqDtPron",
        "outputId": "1470a740-6db8-42f6-a7f7-a1a9d5b13df3"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "array([[1, 2, 3],\n",
              "       [4, 5, 6]])"
            ]
          },
          "metadata": {},
          "execution_count": 5
        }
      ],
      "source": [
        "#スライス指定も可能\n",
        "a[0:2]"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 6,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "OejQdfapPuTs",
        "outputId": "10d7b1d0-47c7-4a91-ab8d-53ebcb3c6ce5"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "array([[1, 2],\n",
              "       [4, 5]])"
            ]
          },
          "metadata": {},
          "execution_count": 6
        }
      ],
      "source": [
        "a[:,0:2]"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 7,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "lo7xrxAXN2vU",
        "outputId": "e6f164be-5d83-4a5b-c3ff-9c204d0cc885"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "array([[2, 3, 4],\n",
              "       [5, 6, 7]])"
            ]
          },
          "metadata": {},
          "execution_count": 7
        }
      ],
      "source": [
        "# 「行列 + 1」は全要素に対する和を実行\n",
        "a + 1"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 8,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "-j8BnkHYN-Md",
        "outputId": "5e46eecb-6a2c-49b4-c233-57395d60895a"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "array([[ 2,  4,  6],\n",
              "       [ 8, 10, 12]])"
            ]
          },
          "metadata": {},
          "execution_count": 8
        }
      ],
      "source": [
        "# *演算子も同様。\n",
        "a * 2"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 9,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "FgY-VZMMOD8a",
        "outputId": "c94911c8-b3ef-4c54-fa46-b4240c90d20c"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "array([[ 1,  4,  9],\n",
              "       [16, 25, 36]])"
            ]
          },
          "metadata": {},
          "execution_count": 9
        }
      ],
      "source": [
        "#行列演算ではない！\n",
        "a * a"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 10,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "CcPzjIcMOB8I",
        "outputId": "fb8d79f0-b574-4592-ca25-1a518263e60c"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "array([[1, 4],\n",
              "       [2, 5],\n",
              "       [3, 6]])"
            ]
          },
          "metadata": {},
          "execution_count": 10
        }
      ],
      "source": [
        "#転置行列\n",
        "a.T"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 11,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "JtsJhxWdOIeY",
        "outputId": "124c4665-ccdd-473c-9ffa-c6f8d276ab4a"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "array([[14, 32],\n",
              "       [32, 77]])"
            ]
          },
          "metadata": {},
          "execution_count": 11
        }
      ],
      "source": [
        "#内積を求めるにはdot関数を使う\n",
        "np.dot(a, a.T)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 12,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "PJOJFvUBOKui",
        "outputId": "6deaab6b-603b-470a-fbb1-2666ab208457"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "array([[ 1.42592593, -0.59259259],\n",
              "       [-0.59259259,  0.25925926]])"
            ]
          },
          "metadata": {},
          "execution_count": 12
        }
      ],
      "source": [
        "#逆行列\n",
        "np.linalg.inv(np.dot(a, a.T))"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 13,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "by0xPzqUOVMz",
        "outputId": "abfee6f3-7b66-4736-f943-1a32478852b2"
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "[[0. 0. 0.]\n",
            " [0. 0. 0.]]\n",
            "[[1. 1. 1.]\n",
            " [1. 1. 1.]]\n",
            "[[1. 0. 0.]\n",
            " [0. 1. 0.]\n",
            " [0. 0. 1.]]\n"
          ]
        }
      ],
      "source": [
        "#ゼロ行列、1行列、対角行列\n",
        "print(np.zeros((2,3)))\n",
        "\n",
        "print(np.ones((2,3)))\n",
        "\n",
        "print(np.eye(3))"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 14,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "vSzfhXAdOc6C",
        "outputId": "e62e311b-99ea-4d52-db95-ec2a8b568b77"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "array([0. , 0.3, 0.6, 0.9])"
            ]
          },
          "metadata": {},
          "execution_count": 14
        }
      ],
      "source": [
        "#特定範囲内で幅を指定してサンプル点を用意。\n",
        "#例えば、\n",
        "# 「y=x**2」のグラフを描画したいとき、\n",
        "#　定義域「-10〜10の範囲で0.1刻みでサンプル点を用意」みたいなときに便利。\n",
        "np.arange(0, 1, 0.3)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 15,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "cZEqbhjQPAZ0",
        "outputId": "6d091b82-db18-4554-8bd7-2722eec20017"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "array([0, 1, 2, 3, 4, 5, 6, 7])"
            ]
          },
          "metadata": {},
          "execution_count": 15
        }
      ],
      "source": [
        "#np.arangeで始点、刻み幅を省略すると0から指定個数の整数を用意。\n",
        "np.arange(8)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 16,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "_UFbdjmUPO8k",
        "outputId": "076dff34-ae84-4083-ef1f-6c951d845062"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "array([[0, 1, 2],\n",
              "       [3, 4, 5]])"
            ]
          },
          "metadata": {},
          "execution_count": 16
        }
      ],
      "source": [
        "#行列の形を変形できる。\n",
        "np.reshape(np.arange(6),(2,3))"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 17,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "Yi3pLN6SPXTF",
        "outputId": "b6eb294e-28c4-43ce-c3bd-d25022c9e9f4"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "array([0., 1., 2.])"
            ]
          },
          "metadata": {},
          "execution_count": 17
        }
      ],
      "source": [
        "#刻み幅はどうでも良いからサンプル数を指定したい場合に便利。\n",
        "np.linspace(0,2,3)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 18,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "3toSvv6VPeRv",
        "outputId": "885aee36-c6cf-4860-8f7d-5cb9a8990941"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "array([0.        , 0.66666667, 1.33333333, 2.        ])"
            ]
          },
          "metadata": {},
          "execution_count": 18
        }
      ],
      "source": [
        "np.linspace(0,2,4)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 19,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "K1-31QgpPy7W",
        "outputId": "7340aced-106c-4096-a67f-f212a2425ce4"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "array([[ 1,  2,  3],\n",
              "       [ 4,  5,  6],\n",
              "       [ 7,  8,  9],\n",
              "       [10, 11, 12]])"
            ]
          },
          "metadata": {},
          "execution_count": 19
        }
      ],
      "source": [
        "#行列を結合できる。\n",
        "#縦方向に結合\n",
        "a = np.array([[1,2,3], [4,5,6]])\n",
        "b = np.array([[7,8,9], [10,11,12]])\n",
        "np.r_[a, b]"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 20,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "Yi-_Je6SP4Jx",
        "outputId": "543a1251-2219-4f8c-a1d4-a4586a109f61"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "array([[ 1,  2,  3,  7,  8,  9],\n",
              "       [ 4,  5,  6, 10, 11, 12]])"
            ]
          },
          "metadata": {},
          "execution_count": 20
        }
      ],
      "source": [
        "#横方向に結合\n",
        "np.c_[a, b]"
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "## np.ndarray型の補足\n",
        "np.ndarray型では行列を2次元配列（≒二重リスト）として表現します。これに対しベクトルは1次元配列（≒通常のリスト）として表現します。このことは次のような想定外の動作に繋がりがちです。"
      ],
      "metadata": {
        "id": "hfd_Ed7oo2gA"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "#　行ベクトルを用意。\n",
        "test1 = np.array([1,2])\n",
        "\n",
        "# test1を転地して列ベクトルを用意。\n",
        "test2 = test1.T\n",
        "\n",
        "# test1,test2のshapeや出力を確認。\n",
        "print(f\"{test1.shape=}, {test2.shape=}\") # test1,2のshapeが同じ？？\n",
        "print(f\"{test1=}\")\n",
        "print(f\"{test2=}\") # test1と同じ？？？"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "yf-IDQ8DpqSs",
        "outputId": "6050bd0c-5ffa-4d09-c3a1-502ff75c0f30"
      },
      "execution_count": 21,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "test1.shape=(2,), test2.shape=(2,)\n",
            "test1=array([1, 2])\n",
            "test2=array([1, 2])\n"
          ]
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "上記のように、1重リストで用意したデータは1次元配列として表現されるだけであり、行ベクトルとか列ベクトルという概念を持っていません。\n",
        "\n",
        "一般的な意味での行ベクトルや列ベクトルのように扱いたい場合には、以下のように明確に区別して書き分ける必要があります。"
      ],
      "metadata": {
        "id": "uqfOhliGqN3i"
      }
    },
    {
      "cell_type": "markdown",
      "source": [
        "### case 1: np.zerosやnp.onesでサイズ指定して列ベクトルを用意する。"
      ],
      "metadata": {
        "id": "s4oWM8mFr8qq"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "# 5行1列の列ベクトルを用意したい場合、\n",
        "# まず zp.zeros() を使ってサイズを指定してゼロベクトルを用意する。\n",
        "test3 = np.zeros((5,1))\n",
        "test3"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "FaIuT1TArH4_",
        "outputId": "5d92d79f-bf5f-40ba-b564-c1c423829981"
      },
      "execution_count": 22,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "array([[0.],\n",
              "       [0.],\n",
              "       [0.],\n",
              "       [0.],\n",
              "       [0.]])"
            ]
          },
          "metadata": {},
          "execution_count": 22
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "# 用意した列ベクトルに対し、必要に応じて値を変更する。\n",
        "test3[0] = 1\n",
        "test3"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "bNjyoiC1rgVi",
        "outputId": "e51e148e-a03b-4b1d-a434-077548a1d05a"
      },
      "execution_count": 23,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "array([[1.],\n",
              "       [0.],\n",
              "       [0.],\n",
              "       [0.],\n",
              "       [0.]])"
            ]
          },
          "metadata": {},
          "execution_count": 23
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "### case 2: 直接値を列挙して作成する。"
      ],
      "metadata": {
        "id": "1kzPjDKnr_zo"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "test4 = np.array([[1], # 1行目\n",
        "                    [2], # 2行目\n",
        "                    [3], # 3行目\n",
        "                    [4], # 4行目\n",
        "                    [5]]) # 5行目\n",
        "\n",
        "print(f\"{test4.shape=}\")\n",
        "print(f\"{test4=}\")"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "zDT2iOISqmP3",
        "outputId": "8d015cf3-dcc1-4a89-c01d-ed8a0b38b764"
      },
      "execution_count": 24,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "test4.shape=(5, 1)\n",
            "test4=array([[1],\n",
            "       [2],\n",
            "       [3],\n",
            "       [4],\n",
            "       [5]])\n"
          ]
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "tf6jJke3XrOG"
      },
      "source": [
        "## 演習演習\n",
        "- ベクトル演算の演習\n",
        "  - (1) 5個の要素を持つ列ベクトルを作成せよ。値は全て1とする。\n",
        "  - (2) 1で作成した列ベクトルのうち、2番目の要素を3.14に更新せよ。なおインデックスは0から数える（0番目、1番目、2番目、、）ものとする。\n",
        "  - (3) 2で作成した列ベクトルを複製し、転置により行ベクトルに変換せよ。\n",
        "  - (4) 用意した列ベクトルと行ベクトルの内積を求めよ。\n",
        "  - (5) [np.random.rand](https://numpy.org/doc/stable/reference/random/generated/numpy.random.rand.html)を用いて、10個の要素を持つ列ベクトルを作成せよ。\n",
        "- 行列演算の演習行列演算の演習\n",
        "  - (6) [np.random.normal](https://numpy.org/doc/stable/reference/random/generated/numpy.random.normal.html)を用いて、平均値10、標準偏差2の正規分布に基づく、2行5列の行列を作成せよ。\n",
        "  - (7) 6で作成した行列から、2列目の要素を抜き出だせ。\n",
        "  - (8) 6で作成した行列から、3列目と4列目の要素を抜き出せ。\n",
        "  - (9) np.random.randで5行2列の行列を用意し、6で用意した行列との積を求めよ。"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 24,
      "metadata": {
        "id": "AHZXG7gpgh6M"
      },
      "outputs": [],
      "source": []
    }
  ],
  "metadata": {
    "colab": {
      "provenance": []
    },
    "kernelspec": {
      "display_name": "Python 3",
      "name": "python3"
    },
    "language_info": {
      "name": "python"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 0
}