ทำความรู้จักกับ 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 กันก่อน
- การสร้างและจัดการอาร์เรย์ 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)
- การคำนวณทางคณิตศาสตร์ เราสามารถใช้ 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)
- การทำงานกับเมทริกซ์ การคำนวณเชิงเมทริกซ์เป็นงานที่ 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)
- การสร้างข้อมูลจำลอง 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 ทำ
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