ทบทวนรวม NumPy & Matplotlib (Module 11–12)

เขียนเอง · หา Bug แล้วเขียนต่อ

ทบทวนรวม NumPy & Matplotlib 🧩

  • เขียนเอง — เขียนโปรแกรมจากศูนย์ ไม่มี ____ และเลือก vectorized / การวาดกราฟเอง
  • หา Bug แล้วเขียนต่อ — แก้บั๊ก axis / view-copy / กราฟไม่ขึ้น แล้วเขียนส่วนที่เหลือ

. . .

Note

รวมทักษะจาก Module 11–12: NumPy array · broadcasting · boolean mask · axis · view/copy · Matplotlib line/bar + label/legend ทบทวนรายโมดูลได้ที่ M11 · M12a · M12b

Important

เนื้อหานี้เป็น เนื้อหาเสริม เท่านั้น — เนื้อหาที่เป็นทางการดูได้จาก exam.cmu.ac.th

เขียนเอง: vectorize / วาดกราฟเอง 🛠️

ไม่มี ____ · เลือกเองว่าจะใช้ axis, boolean mask, broadcasting หรือกราฟชนิดใด

เขียนเอง #1: ค่าเฉลี่ยรายคนและค่าสูงสุด

มี array 2 มิติ (แถว = นักศึกษา, คอลัมน์ = วิชา) จงหาค่าเฉลี่ยของแต่ละคน และค่าเฉลี่ยที่สูงสุด

คิดก่อน: เฉลี่ยรายแถว ใช้ .mean(axis=1) (axis=1 = ยุบคอลัมน์) · แล้วหา .max()

import numpy as np
scores = np.array([[80, 90, 70], [60, 65, 55], [95, 88, 92]])
avg = scores.mean(axis=1)
print(np.round(avg, 2))
print(round(avg.max(), 2))
[80.   60.   91.67]
91.67

เขียนเอง #2: กรองข้อมูลอุณหภูมิสูง

มี array อุณหภูมิ จงดึงเฉพาะค่าที่ >= 35 ออกมา แล้วบอกว่ามีกี่ค่า

คิดก่อน: สร้าง mask ด้วย temps >= 35 แล้วใช้ temps[mask] — ไม่ต้องเขียน loop เลย

import numpy as np
temps = np.array([28, 35, 40, 22, 38, 31])
hot = temps[temps >= 35]
print(hot)
print(len(hot))
[35 40 38]
3

เขียนเอง #3: คิดราคาสุทธิหลังลดและบวกค่าส่ง

มี array ราคาสินค้า จงคิดราคาสุทธิ = ลด 10% แล้วบวกค่าส่ง 20 บาททุกชิ้น (ทำทั้ง array ทีเดียว)

คิดก่อน: ใช้ตัวเลขคูณ/บวกกับ array ได้ตรง ๆ (broadcasting) — prices * 0.9 + 20 ไม่ต้อง loop

import numpy as np
prices = np.array([100, 250, 80, 300])
final = prices * 0.9 + 20
print(final)
[110. 245.  92. 290.]

เขียนเอง #4: กราฟยอดขายรายเดือน

วาด bar chart ยอดขาย 4 เดือน (Jan–Apr) พร้อม title, xlabel, ylabel และชื่อเดือนบนแกน x

คิดก่อน: plt.bar(ชื่อเดือน, ยอดขาย) แล้วเติม .title() .xlabel() .ylabel() และปิดท้ายด้วย plt.show()

import matplotlib.pyplot as plt
months = ["Jan", "Feb", "Mar", "Apr"]
sales = [120, 90, 150, 130]
plt.bar(months, sales)
plt.title("Monthly Sales")
plt.xlabel("Month")
plt.ylabel("Sales")
plt.show()

Tip

ควรได้: กราฟแท่ง 4 แท่ง (Feb เตี้ยสุด, Mar สูงสุด) มีชื่อเดือนใต้แกน x และมีหัวข้อ/ชื่อแกนครบ

หา Bug แล้วเขียนต่อ 🐞➕

โค้ดเริ่มต้นมี บั๊ก 1 จุด และยังทำไม่ครบ — แก้บั๊กก่อน แล้วเขียนส่วนที่เหลือ

หา Bug + เขียนต่อ #5: ค่าเฉลี่ยรายคอลัมน์

โค้ดนี้ควรหาค่าเฉลี่ยของแต่ละคอลัมน์ แต่กลับได้ค่าเฉลี่ยของแต่ละแถว

import numpy as np
data = np.array([[1, 2, 3], [4, 5, 6]])
col_mean = data.mean(axis=1)
print(col_mean)

งาน: (1) แก้ axis ให้ถูก · (2) เขียนต่อให้พิมพ์ค่าเฉลี่ยรวมทั้ง array

Important

บั๊ก: axis=1 = ยุบคอลัมน์ → ได้เฉลี่ยรายแถว · ต้องการรายคอลัมน์ ใช้ axis=0 (ยุบแถว)

หา Bug + เขียนต่อ #5 (ต่อ)

import numpy as np
data = np.array([[1, 2, 3], [4, 5, 6]])
col_mean = data.mean(axis=0)
print(col_mean)
print(data.mean())
[2.5 3.5 4.5]
3.5

หา Bug + เขียนต่อ #6: แก้ข้อมูลส่วนหนึ่งโดยไม่กระทบต้นฉบับ

โค้ดนี้ตั้งใจแก้เฉพาะ b แต่ a กลับเปลี่ยนตามไปด้วย

import numpy as np
a = np.array([10, 20, 30, 40])
b = a[1:3]
b[0] = 999
print(a)

งาน: (1) แก้ให้ a ไม่เปลี่ยน · (2) เขียนต่อให้พิมพ์ทั้ง a และ b

Important

บั๊ก: การ slice array ได้ view (ชี้ข้อมูลก้อนเดียวกัน) → แก้ b กระทบ a · ต้องใช้ a[1:3].copy()

หา Bug + เขียนต่อ #6 (ต่อ)

import numpy as np
a = np.array([10, 20, 30, 40])
b = a[1:3].copy()
b[0] = 999
print(a)
print(b)
[10 20 30 40]
[999  30]

หา Bug + เขียนต่อ #7: กราฟเลขกำลังสอง

โค้ดนี้ควรวาดกราฟเส้นของเลขกำลังสอง แต่รันแล้วไม่เห็นกราฟ

import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5]
y = [1, 4, 9, 16, 25]
plt.plot(x, y)

งาน: (1) แก้ให้กราฟแสดง · (2) เขียนต่อให้ใส่ title, xlabel, ylabel และ legend

Important

บั๊ก: ไม่มี plt.show() → กราฟไม่ถูกแสดง · ต้องปิดท้ายด้วย plt.show() เสมอ

หา Bug + เขียนต่อ #7 (ต่อ)

import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5]
y = [1, 4, 9, 16, 25]
plt.plot(x, y, label="y = x²")
plt.title("Square numbers")
plt.xlabel("x")
plt.ylabel("y")
plt.legend()
plt.show()

Tip

ควรได้: กราฟเส้นโค้งขึ้น มีหัวข้อ “Square numbers” ชื่อแกน x/y และกล่อง legend “y = x²”

หา Bug + เขียนต่อ #8: ฟังก์ชัน normalize ที่แก้ข้อมูลต้นฉบับ

ฟังก์ชันนี้ควร normalize array โดยไม่แตะข้อมูลเดิม แต่หลังเรียกใช้ original กลับเปลี่ยน

import numpy as np

def normalize(data):
    data -= data.min()
    data = data / data.max()
    return data

original = np.array([10.0, 20.0, 30.0, 40.0])
result = normalize(original)
print("result  :", result)
print("original:", original)

งาน: (1) อธิบายว่า original เปลี่ยนเพราะอะไร · (2) แก้ให้ original ไม่ถูกแตะต้อง

Important

สาเหตุ: Python ส่ง NumPy array แบบ pass-by-object-referencedata และ original ชี้ array ก้อนเดียวกัน · data -= data.min() เป็น in-place จึงแก้ต้นฉบับตรง ๆ (เหมือน view ใน M12b)

แก้: data = data.copy() บรรทัดแรกในฟังก์ชัน หรือเปลี่ยนเป็น data = data - data.min()

หา Bug + เขียนต่อ #8 (ต่อ)

import numpy as np

def normalize(data):
    data = data.copy()        # ทำสำเนาก่อน — ไม่แตะต้นฉบับ
    data -= data.min()
    data = data / data.max()
    return data

original = np.array([10.0, 20.0, 30.0, 40.0])
result = normalize(original)
print("result  :", result)
print("original:", original)
result  : [0.         0.33333333 0.66666667 1.        ]
original: [10. 20. 30. 40.]

จบการทบทวน 🎉

พร้อมใช้ NumPy & Matplotlib กับงานจริงแล้ว! ทบทวนรายโมดูลได้ที่ M11 Matplotlib · M12a NumPy · M12b NumPy