{
"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
}