การคูณเมทริกซ์ด้วย np.matmul และ @
คูณเมทริกซ์อย่างถูกต้องด้วย np.matmul และตัวดำเนินการ @ พร้อมแยกความแตกต่างระหว่าง * แบบสมาชิกต่อสมาชิกกับการคูณเมทริกซ์จริง
การคูณเมทริกซ์ด้วย np.matmul และ @ เป็นบทเรียน Pandas & NumPy Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Pandas & NumPy Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Pandas & NumPy Academy มีบทเรียนทั้งหมด 4 บทเรียน
เหตุใดการคูณเมทริกซ์จึงสำคัญ
การคูณเมทริกซ์เป็นหัวใจสำคัญของวิทยาการข้อมูลและการเรียนรู้ของเครื่อง เป็นพื้นฐานของโครงข่ายประสาทเทียม การลดมิติ และการแปลงเชิงเส้น ในไพธอน NumPy มีวิธีคูณเมทริกซ์ที่เข้าใจง่ายสองแบบ ได้แก่ ฟังก์ชัน np.matmul() และตัวดำเนินการ @ ที่เริ่มใช้ในไพธอน 3.5 ทั้งสองแบบทำงานเร็ว ประมวลผลแบบเวกเตอร์ และมีประสิทธิภาพมากกว่าการวนรอบไพธอนซ้อนกันอย่างมาก
กฎของการคูณเมทริกซ์
สำหรับเมทริกซ์ A และ B สองตัว ผลคูณ A @ B จะใช้ได้ก็ต่อเมื่อจำนวนคอลัมน์ใน A เท่ากับจำนวนแถวใน B หาก A มีรูปร่าง (m, n) และ B มีรูปร่าง (n, k) ผลลัพธ์จะมีรูปร่าง (m, k) กฎนี้เรียกว่าเงื่อนไขมิติภายใน และใช้ได้ไม่ว่าคุณจะเลือกใช้ฟังก์ชัน NumPy ใด
import numpy as np
A = np.array([[1, 2], [3, 4]]) # shape (2, 2)
B = np.array([[5, 6], [7, 8]]) # shape (2, 2)
C = A @ B
print(C) # [[19 22] [43 50]]np.matmul กับตัวดำเนินการ @
np.matmul(A, B) และ A @ B ให้ผลลัพธ์เหมือนกันสำหรับอาร์เรย์ 2 มิติ ตัวดำเนินการ @ เป็นเพียงรูปแบบไวยากรณ์ที่เขียนสะดวกขึ้น โดยเบื้องหลังจะเรียก __matmul__ ซึ่ง NumPy นำไปใช้ด้วยรูทีน BLAS ระดับ C เดียวกัน ใช้ @ ในโค้ดทั่วไปเพื่อให้อ่านง่าย และใช้ np.matmul เมื่อคุณต้องการส่งฟังก์ชันเป็นสิ่งที่เรียกใช้ได้ หรือจัดการกรณีขอบอย่างชัดเจน
import numpy as np
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
print(np.matmul(A, B)) # same as A @ B
print(A @ B) # same resultแยกความแตกต่างระหว่าง @, * และ np.dot
NumPy มีฟังก์ชันการคูณสามแบบที่ทำให้สับสนได้ง่าย A * B คือการคูณทีละสมาชิก (ผลคูณฮาดามาร์ด) np.dot(A, B) ทำงานเหมือน np.matmul สำหรับอาร์เรย์ 2 มิติ แต่มีความหมายแตกต่างกันเมื่อใช้กับมิติที่สูงกว่า A @ B คือการคูณเมทริกซ์โดยเฉพาะ และเป็นไปตามนิยามทางคณิตศาสตร์อย่างเคร่งครัด ดังนั้นควรเลือกใช้แทน np.dot เมื่อต้องทำงานกับเมทริกซ์
import numpy as np
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
print('element-wise:', A * B) # [[5 12] [21 32]]
print('matmul:', A @ B) # [[19 22] [43 50]]การคูณเมทริกซ์ไม่สลับที่
ต่างจากการคูณสเกลาร์ การคูณเมทริกซ์ไม่เป็นการสลับที่ โดยทั่วไป A @ B แตกต่างจาก B @ A และรูปร่างของเมทริกซ์อาจไม่เข้ากันได้ในทั้งสองทิศทาง เรื่องนี้สำคัญเมื่อเขียนการแปลง เพราะลำดับการดำเนินการเปลี่ยนผลลัพธ์ได้ ควรตรวจสอบเสมอว่าเมทริกซ์ใดอยู่ทางซ้ายและเมทริกซ์ใดอยู่ทางขวา
import numpy as np
A = np.array([[1, 2], [3, 4]])
B = np.array([[0, 1], [1, 0]])
print('A @ B:', A @ B) # [[2 1] [4 3]]
print('B @ A:', B @ A) # [[3 4] [1 2]] -- different!การคูณเมทริกซ์แบบแบตช์
เมื่ออาร์เรย์ของคุณมีมากกว่าสองมิติ np.matmul และ @ จะถือมิติด้านหน้าที่เพิ่มเข้ามาเป็นมิติแบตช์ และคูณเมทริกซ์แบบขนานกัน ตัวอย่างเช่น อาร์เรย์รูปร่าง (32, 3, 4) คูณกับอาร์เรย์รูปร่าง (32, 4, 5) จะได้ผลลัพธ์รูปร่าง (32, 3, 5) ซึ่งเท่ากับการคูณ 3×4 @ 4×5 ที่เป็นอิสระต่อกัน 32 ครั้งพร้อมกัน นี่คือวิธีที่เฟรมเวิร์กการเรียนรู้เชิงลึกประมวลผลแบตช์ย่อยอย่างมีประสิทธิภาพ
import numpy as np
batch_A = np.random.rand(32, 3, 4)
batch_B = np.random.rand(32, 4, 5)
result = batch_A @ batch_B
print(result.shape) # (32, 3, 5)การคูณเมทริกซ์กับเวกเตอร์
กรณีพิเศษที่พบได้บ่อยคือการคูณเมทริกซ์ด้วยเวกเตอร์ หาก A มีรูปร่าง (m, n) และ v เป็นอาร์เรย์ 1 มิติที่มีความยาว n ดังนั้น A @ v จะให้ผลลัพธ์เป็นอาร์เรย์ 1 มิติที่มีความยาว m NumPy จะจัดแนวรูปร่างให้โดยอัตโนมัติ คุณไม่จำเป็นต้องปรับรูปร่าง v ให้เป็นเวกเตอร์คอลัมน์ รูปแบบนี้พบได้ทั่วไป เช่น การใช้ค่าน้ำหนักในรีเกรสชันเชิงเส้น การฉายฟีเจอร์ และการคำนวณผลคูณจุดของแต่ละแถวพร้อมกัน
import numpy as np
A = np.array([[1, 2, 3], [4, 5, 6]]) # (2, 3)
v = np.array([1, 0, -1]) # (3,)
print(A @ v) # [1-3, 4-6] = [-2, -2]ประสิทธิภาพ: @ เทียบกับการวนรอบไพธอน
การคูณเมทริกซ์ของ NumPy เรียกใช้รูทีน BLAS/LAPACK ที่ได้รับการปรับให้เหมาะสม และทำงานในโค้ด C ที่คอมไพล์แล้ว ส่วนการวนรอบซ้อนกันในไพธอนล้วนที่ทำงานเดียวกันมักจะช้ากว่า 100–1000 เท่าเมื่อใช้กับเมทริกซ์ขนาดใหญ่ เมื่อต้องคูณเมทริกซ์ซ้ำ ๆ ใน pipeline ข้อมูล เช่น การแปลงฟีเจอร์ การฉาย PCA หรือการอัปเดตค่าน้ำหนัก ให้ใช้ @ หรือ np.matmul เสมอ และอย่าเขียนลูปภายในขึ้นเอง
import numpy as np, time
A = np.random.rand(500, 500)
B = np.random.rand(500, 500)
t0 = time.time()
C = A @ B
print(f'NumPy: {(time.time()-t0)*1000:.1f} ms') # single-digit msการต่อการคูณเมทริกซ์หลายรายการ
คุณสามารถต่อการดำเนินการ @ หลายรายการไว้ใน expression เดียวได้ เช่น A @ B @ C ซึ่งจะประเมินจากซ้ายไปขวา NumPy จะไม่ปรับลำดับการคูณให้เหมาะสมโดยอัตโนมัติ (ต่างจาก MATLAB ที่ใช้ mtimes) ดังนั้นหากเมทริกซ์มีขนาดแตกต่างกันมาก ลำดับอาจส่งผลต่อความเร็วได้ สำหรับเมทริกซ์ตั้งแต่สามตัวขึ้นไป ให้พิจารณาใช้ np.linalg.multi_dot([A, B, C]) ซึ่งจะเลือกลำดับการจับคู่ที่มีประสิทธิภาพสูงสุดโดยอัตโนมัติ
import numpy as np
A = np.random.rand(100, 20)
B = np.random.rand(20, 50)
C = np.random.rand(50, 10)
result = np.linalg.multi_dot([A, B, C])
print(result.shape) # (100, 10)ข้อผิดพลาดเกี่ยวกับรูปร่างที่พบบ่อยและวิธีแก้ไข
ข้อผิดพลาดที่พบบ่อยที่สุดในการคูณเมทริกซ์คือรูปร่างไม่ตรงกัน: ValueError: matmul: Input operand 1 has a mismatch in its core dimension 0 วิธีแก้คือตรวจสอบรูปร่างด้วย A.shape และตรวจสอบให้แน่ใจว่ามิติด้านในสอดคล้องกัน หากมีเวกเตอร์แถวรูปร่าง (n,) ที่ต้องการให้ถือเป็นเวกเตอร์คอลัมน์รูปร่าง (n, 1) ให้ใช้ v.reshape(-1, 1) หากต้องการทรานสโพส ให้ใช้ A.T
import numpy as np
A = np.ones((3, 4))
B = np.ones((3, 4)) # wrong -- inner dims 4 != 3
try:
A @ B
except ValueError as e:
print('Error:', e)
print('Fix:', (A @ B.T).shape) # (3, 3)ตัวอย่างเชิงปฏิบัติ: การแปลงคุณลักษณะ
กรณีใช้งานทั่วไปในวิทยาการข้อมูลคือ คุณมีชุดข้อมูล X รูปร่าง (n_samples, n_features) และเมทริกซ์น้ำหนัก W รูปร่าง (n_features, n_outputs) ผลคูณเมทริกซ์ X @ W จะใช้การแปลงเชิงเส้นกับแต่ละตัวอย่างพร้อมกัน และให้ผลลัพธ์รูปร่าง (n_samples, n_outputs) นี่คือการคำนวณหลักของชั้นเชิงเส้นในโครงข่ายประสาทเทียม และการคาดการณ์ด้วยการถดถอยเชิงเส้น
import numpy as np
n_samples, n_features, n_outputs = 200, 10, 3
X = np.random.rand(n_samples, n_features)
W = np.random.rand(n_features, n_outputs)
b = np.zeros(n_outputs)
predictions = X @ W + b # shape (200, 3)
print(predictions.shape)ตรวจสอบความเข้าใจอย่างรวดเร็ว
ทดสอบความเข้าใจของคุณเกี่ยวกับการคูณเมทริกซ์ของ NumPy
สรุปบทเรียน
ในบทเรียนนี้ คุณได้เรียนรู้ว่า np.matmul และ @ ใช้สำหรับการคูณเมทริกซ์อย่างแท้จริง (ไม่ใช่การคูณสมาชิกทีละตัว), มิติด้านในของเมทริกซ์ทั้งสองต้องตรงกัน และ @ รองรับการคูณแบบแบตช์ บนมิติด้านหน้า ต่อไปเราจะสำรวจดีเทอร์มิแนนต์ เมทริกซ์ผกผัน และทรานสโพส ซึ่งเป็นการดำเนินการที่บอกได้ว่าเมทริกซ์สามารถ “ย้อนกลับ” ได้หรือไม่
คำถามที่พบบ่อย
บทเรียน “การคูณเมทริกซ์ด้วย np.matmul และ @” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การคูณเมทริกซ์ด้วย np.matmul และ @” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Pandas & NumPy Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Pandas & NumPy Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การคูณเมทริกซ์ด้วย np.matmul และ @”
คูณเมทริกซ์อย่างถูกต้องด้วย np.matmul และตัวดำเนินการ @ พร้อมแยกความแตกต่างระหว่าง * แบบสมาชิกต่อสมาชิกกับการคูณเมทริกซ์จริง คุณปฏิบัติ Pandas & NumPy Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Pandas & NumPy Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Pandas & NumPy Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “การคูณเมทริกซ์ด้วย np.matmul และ @” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Pandas & NumPy Academy นี้ได้ไหม
ได้ บทเรียน Pandas & NumPy Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การคูณเมทริกซ์ด้วย np.matmul และ @
- ดีเทอร์มิแนนต์ เมทริกซ์ผกผัน และทรานสโพส
- การแก้ระบบสมการเชิงเส้น
- ภาพรวมค่าเฉพาะและ SVD