{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# NumPy\n", "\n", "- `numpy` เป็นหนึ่งในไลบรารี่ของ Python ที่ใช้สำหรับการคำนวณที่ต้องใช้ข้อมูลหลายมิติ (array)\n", "- `numpy` มีประวัติศาสตร์ยาวนานถูกสร้างขึ้นตั้งแต่ปี 2005 โดย Travis Oliphant และถูกใช้งานในการคำนวณทางวิทยาศาสตร์หลากหลายอย่างจนได้รับความนิยมอย่างมากในปัจจุบัน\n", "- `numpy` มี object ที่สำคัญคือ ndarray (หรือ n-dimensional array) ที่ใช้ในการคำนวณ\n", "\n", "ส่วนมากไลบรารี่ numpy จะถูก install มาพร้อมกับ Python อยู่แล้ว แต่ถ้ายังไม่ได้ install มากับโปรแกรม Python สามารถใช้ pip (Python package manager) ในการลงได้\n", "\n", "```sh\n", "!pip install numpy\n", "```\n", "\n", "## Importing NumPy\n", "\n", "การใช้ไลบรารี่ NumPy (บางครั้งอาจจะใช้ numpy, Numpy เพื่อความสะดวก) จะต้องทำการ import ไลบรารี่ก่อนโดยใช้\n", "\n", "```py\n", "import numpy as np\n", "```\n", "\n", "## NumPy Arrays\n", "\n", "NumPy arrays หรือ multidimensional array (`ndarray` หรือ `array`) เป็นเหมือนโครงสร้างข้อมูลหลักของไลบรารี่ โดย arays มีความคล้ายคลึงกับ list ใน Python แต่ว่าสร้างขึ้นมาเพื่อประสิทธิภาพในการคำนวณ\n", "\n", "ตัวอย่างของ Array จะหน้าตาเหมือนกับลิสต์เลย ยกตัวอย่างเช่น\n", "\n", "```\n", "[[1, -1, 0],\n", " [3, 4, 8]]\n", "```\n", "\n", "เป็น array ที่มี 2 แถว (row) และ 3 หลัก (column) หรือบางครั้งบอกได้ว่าแกน (axis) แรกมีความยาวเท่ากับ 2 และแกนที่สองมีความยาวเท่ากับ 3" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": true }, "outputs": [], "source": [ "import numpy as np" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": true }, "outputs": [], "source": [ "# การสร้าง array สามารถสร้างได้จากลิสต์ของ Python\n", "A = np.array([[3, 4, -10], [2, 3, 5]])\n", "print(\"A array:\\n\", A)\n", "print(\"A shape: \", A.shape) # (2, 3) -> 2 rows, 3 columns\n", "\n", "Z = np.zeros((2, 3)) # [[0, 0, 0], [0, 0, 0]]\n", "print(\"Z array:\\n\", Z)\n", "\n", "O = np.ones((2, 3)) # [[1, 1, 1], [1, 1, 1]]\n", "print(\"O array:\\n\", O)\n", "\n", "# สร้าง array ที่มีค่าสุ่มจากช่วง 0 ถึง 1 ที่มีขนาด 2 x 3\n", "R = np.random.rand(2, 3)\n", "print(\"R array:\\n\", R)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": true }, "outputs": [], "source": [ "r_1 = np.arange(0, 10) # สร้าง array จาก 0 ถึง 9\n", "print(r_1)\n", "\n", "r_2 = np.arange(0, 1, 0.1) # สร้าง array จาก 0 ถึง 1 ที่เว้นทีละ 0.1\n", "print(r_2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## **Operations**\n", "\n", "NumPy มี operations คล้ายกับ Python ที่สามารถ +, -, *, / ระหว่าง array ได้ แต่ข้อดีคือเราไม่ต้องใช้ for loop ในการทำ operation สำหรับ array หลายมิติ เช่น" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": true }, "outputs": [], "source": [ "a = np.array([1, 2, 3])\n", "b = np.array([4, 5, 6])\n", "print(a + b)\n", "print(a - b)\n", "print(a * b)\n", "print(a / b)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": true }, "outputs": [], "source": [ "print(np.dot(a, b)) # dot product (คูณ array 2 ตัว)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": true }, "outputs": [], "source": [ "A = np.array([[1, 0], [0, 1]])\n", "B = np.array([[-10, -3], [1, 4]])\n", "print(A.dot(B)) # การ dot product ระหว่าง array (การคูณ matrix) จะได้ผลลัพธ์ [[-10 -3], [ 1 4]]\n", "print(np.dot(A, B)) # จะได้ผลลัพธ์ [[-10 -3], [ 1 4]]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Selection, Transpose, Reshape NumPy Arrays\n", "\n", "เมื่อสร้าง array มาแล้วเราสามารถเลือกข้อมูลบางส่วนของ array, เชื่อมต่อ array, หรือเปลี่ยนมิติ array ได้ด้วยคำสั่งต่างๆ\n", "- การเลือกบาง array สามารถนำมาใช้คัดบาง column ที่เราสนใจจากข้อมูลได้ หรือจะใช้แบ่งข้อมูลตาม row ก็ได้\n", "- การเชื่อม array มีบทบาทสำคัญมากๆในอนาคตโดยอาจนำมาใช้เชื่อมต่อข้อมูล หรือว่าเชื่อมข้อมูลจากหลายที่เข้าด้วยกัน\n", "- การเปลี่ยนมิติใช้ในการจัด dimension ให้เหมาะสมกับการประมวลผล" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": true }, "outputs": [], "source": [ "b = np.array([[2, 3, 4], [7, 2, -3]])\n", "\n", "print(\"b:\\n\", b)\n", "print(\"transpose of b:\\n\", b.T)\n", "print(\"b[:, 1]:\\n\", b[:, 1]) # เลือกทุกแถว, หลักที่ 1\n", "print(\"b[:, 0:2]:\\n\", b[:, 0:2]) # เลือกทุกแถว หลักที่ 0 ถึง 2\n", "print(\"b[0, 0:2]:\\n\", b[1, 0:2])" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": true }, "outputs": [], "source": [ "v = np.array([[-4, -2, -3], [-1, 2, 7]])\n", "\n", "print(np.vstack((b, v))) # เชื่อม array แนวตั้ง (vertical)\n", "print(np.hstack((b, v))) # เชื่อม array แนวนอน (horizontal)\n", "print(np.concatenate((b, v), axis=0)) # เชื่อมแนวตั้งโดยใช้คำสั่ง concatenate" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "cr = np.array([[10, 1, 3, 1, 2, 7]])\n", "print(cr.reshape(6, 1)) # เปลี่ยนเป็นแนวตั้ง 6x1\n", "print(cr.reshape(3, 2)) # เปลี่ยนเป็นขนาด 3x2\n", "\n", "print(cr.ravel()) # ลด dimension จาก 1x6 (1, 6) เป็น (6,) หรือ flatten นั่นเอง" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "อ่านเพิ่มเติมสำหรับการใช้ `.ravel()` ได้ที่ [`numpy.ravel`](https://numpy.org/doc/stable/reference/generated/numpy.ravel.html) เนื่องจากการ flatten array ทำได้หลายวิธี\n", "\n", "## NumPy functions\n", "\n", "NumPy มีฟังก์ชันต่างๆมากมายที่ใช้ในการคำนวณที่ช่วยให้เรานำมาวิเคราะห์ข้อมูลไดในอนาคต เช่น การหาค่าเฉลี่ย `np.mean`, การหาค่ามัธยฐาน `np.median`, รวมถึงค่าความเบี่ยงเบนของข้อมูล `np.std`\n", "\n", "โดยการใช้ฟังก์ชั่นอาจจะทำในแกนที่เราสนใจก็ได้ (ตาม column ใช้ `axis=0`, ตาม row ใช้ `axis=1`)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": true }, "outputs": [], "source": [ "a = np.array([2, 4, 12])\n", "print(np.sqrt(a))\n", "\n", "# operation ที่ทำทั้ง array\n", "print(np.mean(a)) # ค่าเฉลี่ย 6.0\n", "print(np.max(a)) # 12\n", "print(np.min(a)) # 2" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "X = np.array([[1, 1.6], [1.2, 1.8], [2.3, 3.5]])\n", "print(X)\n", "print(X.mean(axis=0)) # หาค่าเฉลี่ยตาม column\n", "print(X.mean(axis=1)) # หาค่าเฉลี่ยตาม row\n", "\n", "\n", "# ทดลองหักลบค่าเฉลี่ยจากทุกแถว\n", "print(\"\\nSubtract average in column:\\n\")\n", "print(X - X.mean(axis=0))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Conclusion\n", "\n", "ในตัวอย่างนี้ เราได้ทดลองใช้ Numpy สร้าง array และทดลองใช้ operations ต่างๆที่ NumPy array มี เช่น การบวก ลบ คูณ หาร รวมถึงการคูณเมทริกซ์ เราได้ทดลองเชื่อม array และทดลองใช้ฟังก์ชั่นการคำนวณต่างๆของ NumPy ที่สามารถนำไปใช้เป็นพื้นฐานในการเรียนบทเรียนถัดไปได้" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**ผู้จัดเตรียม code ใน tutorial**: ดร. ฐิติพัทธ อัชชะกุลวิสุทธิ์" ] } ], "metadata": { "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.13" } }, "nbformat": 4, "nbformat_minor": 2 }