الدرس 4 من 8
ضرب المصفوفات والـ Shapes
إمتى ينفع تضرب مصفوفتين، وإيه اللي بيطلع.
القاعدة الذهبية
عشان تضرب مصفوفة A في مصفوفة B، عدد أعمدة A لازم يساوي عدد صفوف B. والناتج بياخد عدد صفوف A وعدد أعمدة B.
(m × n) @ (n × p) → (m × p)الرقمين اللي في النص لازم يبقوا زي بعض، والناتج بياخد الرقمين اللي برا
| A | B | ينفع؟ | الناتج |
|---|---|---|---|
(4, 3) | (3, 2) | ✓ | (4, 2) |
(2, 5) | (5, 1) | ✓ | (2, 1) |
(4, 3) | (4, 2) | ✗ 3 ≠ 4 | خطأ |
(4, 3) | (4, 2) بعد transpose لـ A | ✓ | (3, 2) |
الفكرة من جوه
كل خانة في الناتج عبارة عن dot product بين صف من A و عمود من B. عشان كده لازم يكونوا بنفس الطول، وإلا مش هتعرف تضربهم في بعض.
🏪 مثال: فروع ومنتجاتعندك ٢ فروع، وكل فرع باع كميات من ٣ منتجات. والمنتجات ليها سعر بيع وتكلفة. عايز الإيراد والتكلفة لكل فرع في خطوة واحدة.
import numpy as np # rows = branches, columns = products (tea, coffee, juice) sales = np.array([ [100, 50, 30], # Nasr City [80, 120, 20], # Maadi ]) # shape (2, 3) # rows = products, columns = [selling price, cost] money = np.array([ [15, 5], [35, 12], [25, 10], ]) # shape (3, 2) result = sales @ money # (2, 3) @ (3, 2) -> (2, 2) print(result) print("Profit per branch:", result[:, 0] - result[:, 1])
لما الـ shapes متتوافقش
import numpy as np a = np.ones((4, 3)) b = np.ones((4, 2)) try: a @ b except ValueError as e: print("Error!") print((a.T @ b).shape) # fix: transpose a -> (3, 4) @ (4, 2)
⚠ هتشوف الخطأ ده كتيرفي PyTorch هيطلعلك حاجة زي
mat1 and mat2 shapes cannot be multiplied (32x100 and 50x10). متتخضش: اكتب الـ shapes على ورقة، وشوف الرقمين اللي في النص مش زي بعض فين. غالباً الحل transpose أو إنك تغير حجم طبقة.💡 الترتيب بيفرقفي الأرقام العادية ٣×٥ زي ٥×٣. في المصفوفات
A @ B غالباً مش زي B @ A، وممكن واحدة منهم متنفعش أصلاً.