Pandas & NumPy Academy · บทเรียน

กฎการกระจายค่า

ทำความเข้าใจกฎการกระจายค่าของ NumPy เพื่อบวกอาร์เรย์หนึ่งมิติเข้ากับทุกแถวของอาร์เรย์สองมิติโดยไม่ต้องทำซ้ำอย่างชัดเจน

บทเรียน 3 จาก 413 ขั้นตอน

กฎการกระจายค่า เป็นบทเรียน Pandas & NumPy Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Pandas & NumPy Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Pandas & NumPy Academy มีบทเรียนทั้งหมด 4 บทเรียน

ปัญหาที่ Broadcasting ช่วยแก้

Broadcasting ช่วยให้ NumPy รวมอาร์เรย์ที่มีรูปทรงแตกต่างกันแต่เข้ากันได้ โดยไม่ต้องคัดลอกข้อมูล อาร์เรย์ที่เล็กกว่าจะถูกขยายให้พอดีกับอาร์เรย์ที่ใหญ่กว่า

import numpy as np

# Adding a scalar to an array is the simplest broadcast
a = np.array([1, 2, 3])
print(a + 10)  # [11 12 13]
# Scalar 10 is 'broadcast' to shape (3,)

กฎ Broadcasting ข้อ 1: เติม 1 ด้านหน้า

NumPy จะจัดรูปทรงให้ตรงกันโดยเริ่มจากด้านขวา หากอาร์เรย์หนึ่งมีจำนวนน้อยกว่ากัน ระบบจะเติม 1 ทางด้านซ้าย ดังนั้นอาร์เรย์ (3,) จึงทำงานเสมือน (1, 3) เมื่ออยู่ถัดจากอาร์เรย์ (4, 3)

import numpy as np

m = np.ones((4, 3))
v = np.array([10, 20, 30])  # shape (3,) -> treated as (1, 3)

result = m + v   # shape (4, 3)
print(result)
# [[11. 21. 31.]
#  [11. 21. 31.]
#  [11. 21. 31.]
#  [11. 21. 31.]]

กฎ Broadcasting ข้อ 2: ขยายมิติที่มีขนาด 1

มิติใดก็ตามที่มี ขนาด 1 สามารถขยายให้ตรงกับอาร์เรย์อีกตัวได้ โดยไม่มีการคัดลอกข้อมูลจริง อาร์เรย์ทั้งสองตัวสามารถขยายมิติที่มีขนาด 1 ได้พร้อมกัน

import numpy as np

# (3, 1) + (1, 4)  -->  (3, 4)
col = np.array([[1], [2], [3]])    # shape (3, 1)
row = np.array([[10, 20, 30, 40]]) # shape (1, 4)
print((col + row).shape)  # (3, 4)
print(col + row)

กฎ Broadcasting ข้อ 3: รูปทรงเข้ากันไม่ได้

หากมิติสองมิติไม่เท่ากันและไม่มีมิติใดมีค่าเป็น 1 broadcasting จะล้มเหลวพร้อม ValueError การตรวจสอบรูปทรงก่อนจะช่วยให้พบข้อผิดพลาดได้อย่างชัดเจน แทนที่จะเกิดข้อผิดพลาดเงียบ ๆ

import numpy as np

a = np.ones(3)
b = np.ones(4)
try:
    a + b
except ValueError as e:
    print(e)
# operands could not be broadcast together with shapes (3,) (4,)

การใช้งานจริง: ลบค่าเฉลี่ยของคอลัมน์

วิธีคลาสสิกคือ ลบค่าเฉลี่ยของแต่ละคอลัมน์ออกจากทุกแถว เพื่อจัดข้อมูลให้อยู่กึ่งกลาง เมื่อใช้ keepdims=True ค่าเฉลี่ยจะคงรูปทรงที่สามารถ broadcast ได้อย่างพอดี

import numpy as np

data = np.array([[1., 2., 3.],
                 [4., 5., 6.],
                 [7., 8., 9.]])

col_mean = data.mean(axis=0)          # shape (3,)
centred = data - col_mean             # broadcast along axis 0
print(centred)
# [[-3. -3. -3.]
#  [ 0.  0.  0.]
#  [ 3.  3.  3.]]

การใช้งานจริง: การปรับค่าของแถวให้เป็นมาตรฐาน

หากต้องการให้ผลรวมของแต่ละแถวเป็น 1 ให้หารด้วยผลรวมของแถวนั้น ใช้ keepdims=True เพื่อให้ผลรวมคงรูปทรงเป็น (n, 1) และ broadcast ไปตามคอลัมน์

import numpy as np

m = np.array([[1., 2., 3.],
              [4., 5., 6.]])

row_sums = m.sum(axis=1, keepdims=True)  # shape (2, 1)
normed = m / row_sums
print(normed.round(3))
# [[0.167 0.333 0.5  ]
#  [0.267 0.333 0.4  ]]

ผลคูณภายนอกด้วย Broadcasting

ปรับรูปทรงอาร์เรย์หนึ่งเป็น (n, 1) และอีกอาร์เรย์เป็น (1, m) จากนั้นคูณกัน broadcasting จะสร้างเมทริกซ์ ผลคูณภายนอกทั้งหมดให้โดยไม่ต้องใช้ลูป

import numpy as np

a = np.array([1, 2, 3])
b = np.array([10, 20, 30, 40])

outer = a[:, np.newaxis] * b[np.newaxis, :]
print(outer)
# [[ 10  20  30  40]
#  [ 20  40  60  80]
#  [ 30  60  90 120]]

Broadcasting กับอาร์เรย์ 3 มิติ

Broadcasting ใช้ได้กับทุกจำนวนมิติ กลุ่มภาพที่มีรูปทรง (100, 28, 28) สามารถจัดให้อยู่กึ่งกลางด้วยค่าเฉลี่ยรายพิกเซลที่มีรูปทรง (1, 28, 28) โดย NumPy จะขยายมิติที่มีค่า 1

import numpy as np

batch = np.random.rand(100, 28, 28)  # 100 images
pixel_mean = batch.mean(axis=0, keepdims=True)  # (1, 28, 28)
centred = batch - pixel_mean          # (100, 28, 28)
print(centred.shape)  # (100, 28, 28)

np.broadcast_to สำหรับการขยายอย่างชัดเจน

np.broadcast_to แสดงให้เห็นอย่างชัดเจนว่า broadcasting จะสร้างผลลัพธ์ใด โดยเป็นมุมมองแบบอ่านอย่างเดียวและไม่คัดลอกข้อมูล เหมาะสำหรับทำความเข้าใจว่ารูปทรงถูกจัดให้ตรงกันอย่างไร

import numpy as np

a = np.array([1, 2, 3])
view = np.broadcast_to(a, (4, 3))
print(view)
# [[1 2 3]
#  [1 2 3]
#  [1 2 3]
#  [1 2 3]]
print(view.flags.writeable)  # False

การมองภาพรูปทรงที่เข้ากันได้

กฎที่ใช้ได้สะดวกคือ จัดรูปทรงให้ตรงกันโดยเริ่มจากด้านขวา แล้วตรวจสอบทีละคู่ รูปทรงจะ เข้ากันได้ หากเท่ากันหรือมีค่าใดค่าหนึ่งเป็น 1 ลองคาดเดารูปทรงก่อนเรียกใช้โค้ด

# Shape compatibility examples:
# (3, 4) + (   4) -> (3, 4)  OK: 4==4, 1 implied
# (3, 4) + (3, 1) -> (3, 4)  OK: 4 vs 1, 3==3
# (2, 3, 4) + (3, 4) -> (2, 3, 4)  OK
# (3, 4) + (3,  ) -> ERROR: 4 vs 3
import numpy as np
print(np.zeros((3,4)).shape)       # (3, 4)
print((np.zeros((3,4)) + np.zeros(4)).shape)  # (3, 4)

ข้อผิดพลาดที่พบบ่อยในการใช้ Broadcasting

ข้อผิดพลาดสำคัญในการใช้ broadcasting คือการลืม keepdims=True หลังการรวมค่า ทำให้รูปทรงไม่ตรงกัน หากไม่แน่ใจ ให้พิมพ์ค่า print(arr.shape) เพื่อดูว่าเกิดอะไรขึ้นจริง

import numpy as np

m = np.arange(6).reshape(2, 3)
row_max = m.max(axis=1)            # shape (2,)  NOT (2,1)
print(row_max.shape)               # (2,)
# m - row_max  -> ERROR: shapes (2,3) and (2,) misalign

row_max_col = row_max[:, np.newaxis]  # shape (2, 1)
print((m - row_max_col).shape)     # (2, 3)  OK

ตรวจสอบความเข้าใจ

ทดสอบความเข้าใจเกี่ยวกับกฎ broadcasting ของ NumPy จากบทเรียนนี้

สรุปบทเรียน

เข้าใจแล้วใช่ไหม! Broadcasting ขยายมิติที่มีขนาด 1 เปรียบเทียบรูปทรงโดยเริ่มจากด้านขวา และ keepdims=True จะคงแกนไว้เพื่อให้การคำนวณตรงกัน บทถัดไป: มาสก์บูลีน

เริ่มต้นได้ฟรี

เรียนรู้ Python ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
30
บทเรียน
120

คำถามที่พบบ่อย

บทเรียน “กฎการกระจายค่า” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “กฎการกระจายค่า” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Pandas & NumPy Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Pandas & NumPy Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “กฎการกระจายค่า”

ทำความเข้าใจกฎการกระจายค่าของ NumPy เพื่อบวกอาร์เรย์หนึ่งมิติเข้ากับทุกแถวของอาร์เรย์สองมิติโดยไม่ต้องทำซ้ำอย่างชัดเจน คุณปฏิบัติ Pandas & NumPy Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Pandas & NumPy Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Pandas & NumPy Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน

บทเรียน “กฎการกระจายค่า” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Pandas & NumPy Academy นี้ได้ไหม

ได้ บทเรียน Pandas & NumPy Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. ฟังก์ชันสากล (ufuncs)
  2. ฟังก์ชันการรวมค่า
  3. กฎการกระจายค่า
  4. การทำมาสก์แบบบูลีนและการใช้ดัชนีแบบยืดหยุ่น
← กลับไปที่ Pandas & NumPy Academy