الدرس 4 من 8

ضرب المصفوفات والـ Shapes

إمتى ينفع تضرب مصفوفتين، وإيه اللي بيطلع.

القاعدة الذهبية

عشان تضرب مصفوفة A في مصفوفة B، عدد أعمدة A لازم يساوي عدد صفوف B. والناتج بياخد عدد صفوف A وعدد أعمدة B.

(m × n) @ (n × p) → (m × p)الرقمين اللي في النص لازم يبقوا زي بعض، والناتج بياخد الرقمين اللي برا
ABينفع؟الناتج
(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. عشان كده لازم يكونوا بنفس الطول، وإلا مش هتعرف تضربهم في بعض.

🏪 مثال: فروع ومنتجاتعندك ٢ فروع، وكل فرع باع كميات من ٣ منتجات. والمنتجات ليها سعر بيع وتكلفة. عايز الإيراد والتكلفة لكل فرع في خطوة واحدة.
branches.py
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 متتوافقش

shape_error.py
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، وممكن واحدة منهم متنفعش أصلاً.
الدرس اللي فات