Skip to main content

ทำความรู้จักกับ Numpy

แนะนำ Numpy และ Pandas

ก่อนที่เราจะเริ่มลุยกัน เราจะต้องทำความคุ้นเคยกับ 2 library ยอดฮิต ที่เกี่ยวข้องกับเรื่องของการอ่านข้อมูล นั่นคือ Numpy และ Pandas

  • Numpy (Numerical Python) เป็น library ที่ออกแบบมาเพื่อทำงานกับ array และ matrix ของข้อมูลตัวเลขอย่างมีประสิทธิภาพ มันช่วยให้สามารถทำการคำนวณเชิงตัวเลขที่ซับซ้อนและประมวลผลข้อมูลได้เร็วกว่า Python พื้นฐาน เพราะ Numpy ใช้โครงสร้างข้อมูลที่เรียกว่า ndarray (N-dimensional array) ที่มีประสิทธิภาพสูง
  • Pandas เป็น library ที่สร้างขึ้นสำหรับการจัดการข้อมูลที่ซับซ้อน เช่น ตารางข้อมูลที่มีหลายคอลัมน์ โดยใช้โครงสร้างข้อมูลสำคัญสองอย่างคือ Series และ DataFrame

โดยความสำคัญของ Numpy และ Pandas ในการจัดการไฟล์

  • การอ่านไฟล์: Pandas ช่วยในการโหลดไฟล์ข้อมูลขนาดใหญ่และซับซ้อนได้ง่าย เช่น ไฟล์ CSV และการประมวลผลข้อมูลแบบตาราง
  • การวิเคราะห์และคำนวณ: เมื่อโหลดข้อมูลมาแล้ว สามารถใช้ Numpy และ Pandas เพื่อทำการวิเคราะห์เชิงตัวเลขและสถิติ เช่น การหาค่าเฉลี่ย การนับข้อมูล หรือการทำงานกับอาร์เรย์ของข้อมูล
  • การแปลงและจัดรูปแบบข้อมูล: Pandas สามารถช่วยในการทำความสะอาดข้อมูลและการแปลงรูปแบบข้อมูลให้อยู่ในรูปแบบที่เหมาะสมสำหรับการประมวลผลเพิ่มเติม

เราจะมาเริ่มต้นจาก Numpy กัน

library Numpy

Numpy (Numerical Python) เป็นไลบรารีของ Python ที่ออกแบบมาเพื่อทำงานกับอาร์เรย์หลายมิติ (N-dimensional array) โดยเฉพาะการคำนวณทางคณิตศาสตร์และตัวเลขที่ซับซ้อนอย่างมีประสิทธิภาพ Numpy ช่วยให้การทำงานกับข้อมูลจำนวนมากเป็นเรื่องง่ายและรวดเร็ว เพราะใช้โครงสร้างข้อมูลอาร์เรย์ที่มีการจัดเก็บข้อมูลต่อเนื่องในหน่วยความจำ ทำให้สามารถคำนวณได้เร็วกว่า Python list แบบปกติ

ความสามารถหลักของ Numpy

  • ndarray: ใช้เพื่อเก็บข้อมูลในรูปแบบหลายมิติ เช่น เวกเตอร์ (1D), เมทริกซ์ (2D) หรือข้อมูลที่ซับซ้อนกว่านั้น (3D ขึ้นไป)
  • function ทางคณิตศาสตร์: รองรับการคำนวณพื้นฐาน เช่น บวก ลบ คูณ หาร, คำนวณค่าเฉลี่ย, ค่าเบี่ยงเบนมาตรฐาน และอื่นๆ
  • การจัดการข้อมูลในรูปแบบเวกเตอร์: ทำให้การประมวลผลข้อมูลในรูปแบบจำนวนมากสามารถทำได้อย่างรวดเร็ว เช่น การคำนวณเชิงเวกเตอร์และเมทริกซ์
  • การประมวลผลภาพและสัญญาณ: Numpy ถูกใช้ในหลายกรณีที่เกี่ยวข้องกับการประมวลผลภาพและการวิเคราะห์ข้อมูลทางสัญญาณ

วิธีใช้งาน numpy เริ่มต้นจะต้องลง library numpy ก่อนด้วยคำสั่ง pip

pip install numpy

เรามาลอง use case ง่ายๆของ numpy กันก่อน

  1. การสร้างและจัดการอาร์เรย์ Numpy ช่วยในการสร้างและจัดการอาร์เรย์หลายมิติได้อย่างง่ายดาย
import numpy as np

# สร้างอาร์เรย์ 1 มิติ
arr1 = np.array([1, 2, 3, 4])
print(arr1)

# สร้างอาร์เรย์ 2 มิติ
arr2 = np.array([[1, 2], [3, 4]])
print(arr2)
  1. การคำนวณทางคณิตศาสตร์ เราสามารถใช้ Numpy เพื่อทำการคำนวณเชิงคณิตศาสตร์กับอาร์เรย์ได้ง่ายขึ้น เช่น บวก ลบ คูณ หาร เวกเตอร์ หรือแม้แต่คำนวณเมทริกซ์
import numpy as np

# สร้างอาร์เรย์
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])

# การบวกอาร์เรย์
result_add = a + b
print(result_add)

# การคูณอาร์เรย์
result_mul = a * b
print(result_mul)

# การคำนวณค่าทางคณิตศาสตร์
mean = np.mean(a) # ค่าเฉลี่ย
std_dev = np.std(a) # ค่าเบี่ยงเบนมาตรฐาน
print("Mean:", mean, "Std Dev:", std_dev)
  1. การทำงานกับเมทริกซ์ การคำนวณเชิงเมทริกซ์เป็นงานที่ Numpy ทำได้อย่างมีประสิทธิภาพ เช่น การคูณเมทริกซ์ (Matrix Multiplication) การคำนวณลอการิทึม หรือลักษณะของข้อมูลอื่นๆ
import numpy as np

# สร้างเมทริกซ์
matrix1 = np.array([[1, 2], [3, 4]])
matrix2 = np.array([[5, 6], [7, 8]])

# การคูณเมทริกซ์
result_matrix = np.dot(matrix1, matrix2)
print(result_matrix)
  1. การสร้างข้อมูลจำลอง Numpy มี function ในการสร้างข้อมูลจำลอง (synthetic data) เช่น สุ่มตัวเลขหรือสร้างข้อมูลในช่วงที่กำหนด
import numpy as np

# สร้างอาร์เรย์ของเลขสุ่ม
random_arr = np.random.rand(3, 3) # อาร์เรย์สุ่มขนาด 3x3
print(random_arr)

# สร้างลำดับข้อมูล
sequence_arr = np.arange(0, 10, 2) # สร้างลำดับข้อมูลจาก 0 ถึง 9 โดยเพิ่มทีละ 2
print(sequence_arr)

Numpy เป็นเครื่องมือที่ทรงพลังสำหรับการจัดการข้อมูลที่เกี่ยวกับตัวเลขและการคำนวณทางคณิตศาสตร์ ช่วยให้เราสามารถสร้างและจัดการอาร์เรย์หรือเมทริกซ์หลายมิติได้ง่ายดายและรวดเร็ว นอกจากนี้ยังถูกนำไปใช้ในหลากหลายงาน เช่น การวิเคราะห์ข้อมูล การสร้างข้อมูลจำลอง และการประมวลผลภาพ ด้วยเช่นกัน

ทำไมต้อง Numpy

เชื่อว่าคำถามสำคัญที่หลายคนอาจจะสงสัย “ทำไมการใช้ numpy จึงดีกว่าการใช้ list ใน python ทั่วไป ?” เราจะมาลองแชร์เหตุผลในแต่ละมุมมองกัน

1. Performance

Numpy ถูกสร้างขึ้นเพื่อให้ทำงานกับข้อมูลจำนวนมากได้อย่างมีประสิทธิภาพสูง เนื่องจาก Numpy ใช้การจัดเก็บข้อมูลในรูปแบบ ndarray ซึ่งเป็นอาร์เรย์ที่เก็บข้อมูลในหน่วยความจำแบบต่อเนื่อง (contiguous memory) ต่างจาก Python list ที่เป็นโครงสร้างข้อมูลแบบเก็บค่าในลักษณะของ pointers ทำให้ Numpy สามารถเข้าถึงข้อมูลและทำการคำนวณได้เร็วกว่า

  • Numpy ใช้การคำนวณเชิงเวกเตอร์ (vectorization) ซึ่งสามารถทำการคำนวณหลาย ๆ ค่าในเวลาเดียวกัน (parallel computing)
  • Python list ต้องใช้ loop ในการเข้าถึงและคำนวณแต่ละรายการ ซึ่งจะช้ากว่า Numpy ที่ทำการคำนวณบนอาร์เรย์ทั้งก้อนในครั้งเดียว

ตัวอย่างการคำนวณด้วย Numpy vs. List

import numpy as np
import time

# ใช้ Numpy array
arr = np.arange(1000000)

start_time = time.time()
arr = arr * 2
print("Numpy time:", time.time() - start_time)

# ใช้ Python list
lst = list(range(1000000))

start_time = time.time()
lst = [x * 2 for x in lst]
print("List time:", time.time() - start_time)

ผลลัพธ์จากการ run

Numpy time: 0.0008330345153808594
List time: 0.06482195854187012

เราจะค้นพบว่า “Numpy จะทำงานได้เร็วกว่ามาก” เนื่องจากคุณสมบัติ การจัดการหน่วยความจำแบบต่อเนื่อง (Contiguous Memory Allocation) ของ Numpy

Numpy ใช้โครงสร้างข้อมูลที่เรียกว่า ndarray ซึ่งเก็บข้อมูลเป็นประเภทเดียวกันทั้งหมด (homogeneous) และเก็บในหน่วยความจำที่ต่อเนื่องกัน (contiguous memory block) ต่างจาก Python list ที่ข้อมูลแต่ละตัวสามารถมีประเภทที่ต่างกันได้และเก็บข้อมูลเป็น pointers ที่เชื่อมต่อกัน

การที่ Numpy เก็บข้อมูลในหน่วยความจำแบบต่อเนื่องทำให้การเข้าถึงข้อมูล (memory access) และการคำนวณสามารถทำได้เร็วขึ้น เนื่องจาก CPU สามารถดึงข้อมูลมาประมวลผลได้ในครั้งเดียวจากหน่วยความจำ และหลีกเลี่ยงการกระโดดไปตาม pointers เหมือนที่ Python list ทำ

memory.webp

ref: https://www.geeksforgeeks.org/difference-between-contiguous-and-noncontiguous-memory-allocation/

2. Memory Efficiency

Numpy ใช้หน่วยความจำอย่างมีประสิทธิภาพมากกว่า Python list เนื่องจากข้อมูลใน Numpy array ถูกเก็บเป็นประเภทข้อมูลเดียวกัน (homogeneous) เช่น ตัวเลขทศนิยมทั้งหมด หรือ ตัวเลขจำนวนเต็มทั้งหมด ต่างจาก Python list ที่สามารถเก็บข้อมูลหลากหลายประเภทในรายการเดียวกันได้ (heterogeneous) แต่ต้องแลกมาด้วยการใช้หน่วยความจำที่มากกว่า

import numpy as np
import sys

# ขนาดของ Numpy array
arr = np.array([1, 2, 3, 4, 5])
print("Numpy array memory:", arr.nbytes)

# ขนาดของ Python list
lst = [1, 2, 3, 4, 5]
print("Python list memory:", sys.getsizeof(lst))

ผลลัพธ์จากการ run

Numpy array memory: 40
Python list memory: 96

ผลลัพธ์: Numpy array จะใช้หน่วยความจำน้อยกว่ามากในการเก็บข้อมูลแบบเดียวกัน

ซึ่งเหตุผลก็เหมือนกับเรื่องของ Performance เลย เนื่องจาก Numpy จัดเก็บข้อมูลในหน่วยความจำแบบต่อเนื่อง ทำให้เวลาเก็บข้อมูล เช่น [1, 2, 3, 4, 5] จะถูกเก็บติดกัน “เป็นบล็อกเดียว” แตกต่างกับ Python List ที่แต่ละตัวเลขในลิสต์จะถูกเก็บแยกกัน โดยมีตัวชี้ (pointers) ที่ชี้ไปยังตำแหน่งของแต่ละค่าข้อมูลในหน่วยความจำ

รวมถึง Numpy array จะเก็บข้อมูลในรูปแบบที่มีประเภทเดียวกันเสมอ (homogeneous data) เช่น ข้อมูลทั้งหมดในอาร์เรย์เป็น int, float, หรือ bool ซึ่งทำให้สามารถจัดสรรพื้นที่หน่วยความจำให้เหมาะสมตามประเภทของข้อมูลนั้นได้

ตัวอย่าง

  • Numpy: np.array([1, 2, 3]) ข้อมูลทั้งหมดเป็น int จึงใช้พื้นที่แบบเดียวกัน
  • Python list: [1, 2.0, 'three'] ข้อมูลมีหลายประเภท (int, float, str) จึงใช้พื้นที่มากกว่าในการจัดการข้อมูลที่แตกต่างกัน

จึงเห็นเหตุผลที่ทำให้ numpy ใช้ Memory ที่น้อยกว่าการใช้ใน Python list ได้

3. Vectorized Operations

Numpy รองรับการทำงานแบบเชิงเวกเตอร์ ซึ่งช่วยให้สามารถทำการคำนวณกับข้อมูลทั้งก้อนพร้อมกันได้ โดยไม่ต้องใช้ loop ทำให้การคำนวณเร็วขึ้นและเขียนโค้ดได้ง่ายกว่า

เช่น ถ้าใน Numpy เราจะใช้วิธีนี้ในการคูณ

import numpy as np

# ใช้ Numpy ในการคูณทั้งอาร์เรย์
arr = np.array([1, 2, 3, 4, 5])
result = arr * 2 # คูณทุกค่าด้วย 2 ในครั้งเดียว
print(result)

ในทางตรงกันข้าม Python list ต้องใช้ loop ในการคำนวณแบบนี้:

# ใช้ list ในการคูณแต่ละค่า
lst = [1, 2, 3, 4, 5]
result = [x * 2 for x in lst]
print(result)

ผลลัพธ์: การใช้ Numpy ทำให้โค้ดสั้นกว่าและเร็วกว่า

รวมถึง การคำนวณแบบ Vectorized Operations ใน Numpy จะเกิดขึ้นกับข้อมูลทั้งหมดในอาร์เรย์ในครั้งเดียว โดยไม่ต้องมี overhead ของการจัดการ pointers หรืออ้างอิงค่าหลายครั้ง ก็จะส่งผลบวกต่อ Performance ด้วยเช่นเดียวกัน

และนี่คือคำถามที่อาจจะสำคัญกว่า “เราควรรู้จัก Numpy ไปทำไม” คำตอบก็คือ มันเป็น library ที่อำนวยความสะดวกให้กับ Pandas ที่ถูกสร้างขึ้นโดยใช้ Numpy เป็นพื้นฐาน ทำให้ Pandas มีความสามารถในการทำงานกับข้อมูลในรูปแบบอาร์เรย์ (arrays) ซึ่งเป็นโครงสร้างข้อมูลหลักของ Numpy นอกจากนี้ Pandas ยังขยายความสามารถของ Numpy โดยเพิ่มฟีเจอร์ที่ทำให้การจัดการข้อมูลในรูปแบบตาราง (tabular data) และการทำงานกับข้อมูลเชิงสถิติทำได้ง่ายขึ้น

Ref