{ "cells": [ { "cell_type": "markdown", "metadata": { "id": "WUZm-Jbl3V6n" }, "source": [ "## $\\Large{Numpy\\; Tutorial \\;(part1)}$\n", "\n", "Numpy 是使用Python進行科學運算中最基礎的模組,主要的功能環繞在**ndarray (n-dimensional array,中文為多維陣列)**物件上。\n", "\n", "最直覺的想法可以將它看成是一維的列表(list)或是二維矩陣(matrix),然而由於ndarray可以表示超過二維的資料,因此即使在讀取圖片或影像等資料上也非常地依賴Numpy這個套件。因此這個部分我們將帶大家了解Numpy所提供的功能與函式。\n" ] }, { "cell_type": "markdown", "metadata": { "id": "5PUzHp1TCuJX" }, "source": [ "### 本章節內容大綱\n", "* [事前準備](#事前準備)\n", " - [載入Numpy套件](#載入Numpy套件)\n", " - [Numpy中的「維度」概念](#Numpy中的「維度」概念)\n", "* [創建多維陣列(Array Creation)](#創建多維陣列)\n", " - [將List轉換為ndarray](#將List轉換為ndarray)\n", " - [其他創建陣列的方法](#其他創建陣列的方法)\n", "* [多維陣列的屬性(Array Attributes)](#多維陣列的屬性)\n", " - [陣列維度與大小](#陣列維度與大小)\n", " - [陣列中的資料型態](#陣列中的資料型態)\n", "* [陣列運算](#陣列運算)\n", " - [基本數學運算](#基本數學運算)\n", " - [描述性統計](#描述性統計)" ] }, { "cell_type": "markdown", "metadata": { "id": "Gx1M52QtCuJY" }, "source": [ "---\n", "\n", "## 事前準備" ] }, { "cell_type": "markdown", "metadata": { "id": "umROlvEMCuJZ" }, "source": [ "\n", "- ### 載入Numpy套件\n", "Numpy所提供的函數都是原本在Python內沒有的,如果想使用的話,需要先輸入**import numpy as np**才能使用這些函數。\n", "\n", " 如果後續往下執行時看到錯誤訊息 **NameError: name 'np' is not defined**,就代表你可能忘了載入套件(或是打錯字),Python當下不知道np是甚麼東西喔。\n", "\n", "" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "-KkHcKzuCuJa" }, "outputs": [], "source": [ "import numpy as np" ] }, { "cell_type": "markdown", "metadata": { "id": "dmiOTkla3V6v" }, "source": [ "\n", "- ### Numpy中的「維度」概念\n", "既然numpy提供的物件類型叫做**n維陣列**,我們首先就得來說說在numpy裡面的維度代表的意義以及如何計算。\n", "\n", "" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "tjZxPx4r3V6x" }, "outputs": [], "source": [ "# 一個維度的陣列\n", "# 這個陣列內有3個元素,因此我們說這個陣列是一維陣列,長度是 3\n", "[1, 3, 5]\n", "\n", "# 兩個維度的陣列\n", "# 這個陣列內有2個子陣列,每個子陣列內又有3個元素,因此我們說這個陣列是二維陣列,的第一個維度長度是 2 ,第二個維度長度是 3\n", "# [[ 1, 3, 5],\n", "# [ 2, 4, 6]]" ] }, { "cell_type": "markdown", "metadata": { "id": "iq77ROHzCuJf" }, "source": [ "---\n", "\n", "## 創建多維陣列\n", "在numpy中,我們可以將一個列表轉換為陣列型態,也可以使用numpy所提供的函數創建一些常見的陣列" ] }, { "cell_type": "markdown", "metadata": { "id": "E31IGHb2CuJg" }, "source": [ "\n", "- ### 將List轉換為ndarray" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "BVgv9uD83V6_" }, "outputs": [], "source": [ "# 一個已經被定義好的list\n", "existed_list = [18, 15, 21, 10, 88, 76, 29, 20]\n", "\n", "# 印出來看看\n", "print(existed_list)\n", "print(type(existed_list))" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "6CAbeII1CuJk" }, "outputs": [], "source": [ "# 將這個list轉換為ndarray的型態\n", "np_array = np.array(existed_list)\n", "\n", "# 印出來看看\n", "print(np_array)\n", "print(type(np_array))\n", "# 可以發現雖然看起來也很像原本的list,但它的類型已經是ndarray了" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "chT6r0KTCuJl" }, "outputs": [], "source": [ "# list of lists 可以轉換為 2d array\n", "list_of_lists = [[1, 2, 3], [4, 5, 6]]\n", "\n", "# 將這個物件轉為ndarray的型態\n", "np_array = np.array(list_of_lists)\n", "\n", "# 印出來看看\n", "print(np_array)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "Hyfi82r3fZAs" }, "outputs": [], "source": [ "print(type(np_array))" ] }, { "cell_type": "markdown", "metadata": { "id": "wj4B74ga3V7V" }, "source": [ "\n", "- ### 其他創建陣列的方法" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "4iSp-YEa3V7V" }, "outputs": [], "source": [ "# 產生從0到2的一維陣列\n", "print(np.arange(3))\n", "\n", "# array([0., 1., 2.])" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "hU9aQxTPCuJn" }, "outputs": [], "source": [ "# 給定長度,產生元素皆為0的陣列\n", "print(np.zeros(3))\n", "\n", "# array([ 0., 0., 0.])\n", "\n", "\n", "# 給定矩陣大小,產生元素皆為0的陣列\n", "print(np.zeros((2, 3)))\n", "\n", "# array([[ 0., 0., 0.],\n", "# [ 0., 0., 0.]])" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "VqgZkurVCuJn" }, "outputs": [], "source": [ "# 給定矩陣大小,產生元素皆為1的陣列\n", "print(np.ones((2, 3)))\n", "\n", "# array([[ 1., 1., 1.],\n", "# [ 1., 1., 1.]])" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "cLHWkCQqCuJo" }, "outputs": [], "source": [ "# 參照陣列\n", "reference_array = np.array([[1., 2., 3.], [4., 5., 6.]])\n", "\n", "# 建立一個跟參照陣列相同大小且元素都是0的陣列\n", "print(np.zeros_like(reference_array))\n", "\n", "# array([[0., 0., 0.],\n", "# [0., 0., 0.]])\n", "\n", "# 建立一個跟參照陣列相同大小且元素都是1的陣列\n", "print(np.ones_like(reference_array))\n", "\n", "# array([[1., 1., 1.],\n", "# [1., 1., 1.]])" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "CeokuVXmfZAu" }, "outputs": [], "source": [ "print(reference_array)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "LmppjnkwCuJo" }, "outputs": [], "source": [ "# 從 1 到 10 均勻地找 10 個點\n", "print(np.linspace(start=1, stop=10, num=10))\n", "\n", "# array([ 1., 2., 3., 4., 5., 6., 7., 8., 9., 10.])" ] }, { "cell_type": "markdown", "metadata": { "id": "MtyzYeUy3V7J" }, "source": [ "---\n", "\n", "## 多維陣列的屬性" ] }, { "cell_type": "markdown", "metadata": { "id": "hpxl7FGbCuJp" }, "source": [ "\n", "- ### 陣列維度與大小\n", "\n", "" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "2STp8nGX3V7L" }, "outputs": [], "source": [ "# 創建一個陣列\n", "x = np.arange(3)\n", "print(x)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "BWJVW8nNCuJq" }, "outputs": [], "source": [ "# ndim - 呈現這個陣列的維度\n", "print(x.ndim) # 1 dim" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "AFj7U-qqCuJq" }, "outputs": [], "source": [ "# shape - 呈現這個陣列每個維度的大小\n", "print(x.shape) # (3, )" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "J0OIKDrFCuJr" }, "outputs": [], "source": [ "# size - 呈現陣列總共的元素數量\n", "print(x.size) # 3" ] }, { "cell_type": "markdown", "metadata": { "id": "IWI2N-CTCuJr" }, "source": [ "\n", "- ### 陣列中的資料型態\n", "我們上面到陣列裡面最常見的是放入數字,但也可以接受文字或其他資料型態。不過即使是數字也有整數、浮點數、以及精度的差異,這個部份我們就來看一下在numpy中要如何查看以及改變陣列的資料型態。\n", "\n", "```小提醒,如果陣列中的元素是無法被轉成數字的文字,即使強制想要改變陣列資料型態為數值類型(ex.int32)也會報錯唷```" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "x8i9OCGrCuJs" }, "outputs": [], "source": [ "# 創建一個陣列\n", "x = np.arange(3)\n", "\n", "# 印出這個陣列的資料型態\n", "print(x.dtype)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "beZ2ktGLfZAw" }, "outputs": [], "source": [ "x" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "0LT6O929CuJs" }, "outputs": [], "source": [ "# 改變資料型態\n", "x = x.astype('float32')\n", "print(x.dtype)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "TZBqH__gfZAw" }, "outputs": [], "source": [ "x" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "Yveo6ZYNCuJs" }, "outputs": [], "source": [ "# 在創建時也可以指定資料的型態\n", "y = np.arange(3, dtype='float64') # [ 0. 1. 2.]\n", "print(y.dtype)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "nC6SK2sUfZAx" }, "outputs": [], "source": [ "y" ] }, { "cell_type": "markdown", "metadata": { "id": "2vg9SFnqCuJs" }, "source": [ "---\n", "\n", "## 陣列運算\n", "\n", "有了這樣的好幫手之後,我們總得看一下陣列可以幫助我們做甚麼事情。\n", "\n", "```(大家也可以試著想想看如果我們只有list可以使用的話要如何下面的事情呢)```" ] }, { "cell_type": "markdown", "metadata": { "id": "U1TmkxVn3V7x" }, "source": [ "\n", "- ### 基本數學運算" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "9YEhw96i3V7z" }, "outputs": [], "source": [ "a = np.array([[1, 2], [3, 4]])\n", "b = np.array([[5, 6], [7, 8]])\n", "\n", "print(a)\n", "print('---------')\n", "print(b)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "drINB4BMCuJt" }, "outputs": [], "source": [ "print(a + b) # array([[6, 8], [10, 12]])" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "lzNE9Ms4CuJt" }, "outputs": [], "source": [ "print(a - b) # array([[-4, -4], [-4, -4]])" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "2ZG2UHwQCuJu" }, "outputs": [], "source": [ "print(a * b) # array([[5, 12], [21, 32]])\n", "print(a / b) # array([[0.2, 0.33333333], [0.42857143, 0.5]]" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "XyXTrehiCuJu" }, "outputs": [], "source": [ "# broadcasting - https://docs.scipy.org/doc/numpy/user/basics.broadcasting.html\n", "\n", "print(a - 1) # array([[0, 1], [2, 3]])\n", "print(a * 2) # array([[2, 4], [6, 8]])" ] }, { "cell_type": "markdown", "metadata": { "id": "mHZ3rOqECuJv" }, "source": [ "\n", "- ### 描述性統計" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "6Y1b7-srCuJw" }, "outputs": [], "source": [ "# 創建一個ndarray\n", "x = np.array([[0, 1, 2], [3, 4, 5]])\n", "print(x)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "jGwLWLimCuJx" }, "outputs": [], "source": [ "# 陣列中元素的最大值\n", "print(x.max())\n", "# 5" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "dJi22DBfCuJx" }, "outputs": [], "source": [ "# 陣列中元素的總和\n", "print(x.sum())\n", "# 15" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "znVrh9DnCuJy" }, "outputs": [], "source": [ "# 陣列中元素的平均數\n", "print(x.mean())\n", "# 2.5" ] }, { "cell_type": "markdown", "metadata": { "id": "MaAJHVafCuJy" }, "source": [ "還記得一開始提到的陣列維度嗎? Numpy另一個厲害的地方是我們可以沿著某一個特定的軸去做運算。但甚麼叫做\"沿著某一個特定的軸\"呢? 讓我們看一下以下的例子。\n", "\n", "\n", "\n", "[[0,1,2],[3,4,5]] 這個矩陣有兩個軸,第一個軸長度為2,第二個軸長度為3 (可以從陣列的shape來確認這件事情)\n", "\n", "如果我們沿著第一個軸(記得第一個軸是axis = 0 唷)去做總和,就代表我們將第一個軸上的元素當作同一組來做加總,因此在這個例子會產生3個總和的數字。\n", "\n", "如果我們沿著第二個軸做總和的計算,代表我們將第二個軸上的元素當作同一組來作加總,在這個例子會產生2個總和的數字。\n", "\n", "\n", "\n", "```除了對陣列做總和之外,計算最大值、平均數等函數也都可以加入axis這個參數唷```" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "nwMxtVIjCuJy" }, "outputs": [], "source": [ "# 創建一個shape為(2,3)的陣列\n", "x = np.array([[0, 1, 2], [3, 4, 5]])\n", "print(x)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "B8v586i4CuJz" }, "outputs": [], "source": [ "# 沿著第一個軸做總和\n", "print(x.sum(axis=0))\n", "# [3, 5, 7]" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "XUuplxLICuJz" }, "outputs": [], "source": [ "# 沿著第二個軸做總和\n", "print(x.sum(axis=1))\n", "# [3, 12]" ] } ], "metadata": { "colab": { "name": "Numpy_part1.ipynb", "provenance": [] }, "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.10" }, "vscode": { "interpreter": { "hash": "4806973172b6f80f57bb1aa45845d5bdbcd90c3f87ca3115b740d7fa400a1c3b" } } }, "nbformat": 4, "nbformat_minor": 0 }