Python Matris Çarpımı

Merhabalar,

Biliyorsunuz, matrislerle çarpma işleminde bazı kurallar var.

_x = [[2, 1], [-1, 4]]  # 2 x 2'lik bir matris
_y = [[5, 0, 3], [2, 4, 3]]  # 2 x 3'lük bir matris

Mesela bu yukarıdaki matrisler çarpılabilir.
Peki bunları nasıl çarparız?

[2, 1] [5, 0, 3]  [2x5 + 1x2, 2x0 + 1x4, 2x3 + 1x3]
[-1, 4] [2, 4, 3] [-1x5 + 4x2, -1x0 + 4x4, -1x3 + 4x3]

Bu işlemin sonucunda 2x3'lük bir matris oluşur.

[12, 4, 9]
[3, 16, 9]

Burada çarpma işlemini temsili olarak şöyle gösterebiliriz:

[
    [x[0][0] * y[0][0] + x[0][1] * y[1][0], x[0][0] * y[0][1] + x[0][1] * y[1][1], x[0][0] * y[0][2] + x[0][1] * y[1][2]]
    [x[1][0] * y[0][0] + x[1][1] * y[1][0], x[1][0] * y[0][1] + x[1][1] * y[1][1], x[1][0] * y[0][2] + x[1][1] * y[1][2]]
]

Burada dikkatinizi çekmesi gereken bir örüntü var aslında.

Önce x[0][0] ile y[0][0] çarpılıyor ve bu bulunan sayı, x[0][1] ve y[1][0]'ın çarpımıyla toplanıyor. x bir sonraki sütuna geçtiğine, y bir sonraki satıra geçiyor.

Yani oluşacak matrisimiz şöyle olsun diyelim:

[
    [a, b, c]
    [d, e, f],
]

Bu yukarıdaki abcdef değerleri şöyle hesaplanıyor o zaman:

a = x[0][0] * y[0][0] + x[0][1] * y[1][0]
b = x[0][0] * y[0][1] + x[0][1] * y[1][1]
c = x[0][0] * y[0][2] + x[0][1] * y[1][2]
d = x[1][0] * y[0][0] + x[1][1] * y[1][0]
e = x[1][0] * y[0][1] + x[1][1] * y[1][1]
f = x[1][0] * y[0][2] + x[1][1] * y[1][2]

Buradaki satır ve sütun değişimlerinin nasıl gerçekleştiğini bulmak gerekiyor. Aşağıdaki algoritmaya bakın isterseniz.

def multiply(x, y):
    if len(x[0]) != len(y):
        raise ValueError(
            f"Çarpım işlemi yapılamaz, çünkü 1. matrisin sütun "
            f"sayısı olan {x[0]}, ikinci matrisin satır sayısı "
            f"olan {len(y)} sayısına eşit değil."
        )
    result = []
    for i in range(len(x)):  # 1. matrisin satır sayısı kadar
        row = []  # Listeler oluştur.
        for j in range(len(y[0])):  # 2. matrisin sütun sayısı kadar
            value = 0  # Değeri 0 olan sayılar oluştur.
            # 1. matrisin sütun sayısı değiştiğinde
            # 2. matrisin satır sayısını değiştirmek için
            # Aşağıdaki gibi bir for döngüsü tanımlayabiliriz.
            for k in range(len(x[0])):
                value += x[i][k] * y[k][j]
                # x[i]'ın sütun değerlerine ulaşmak istediğimiz için
                # x[i][k] ifadesini kullandık.
                # y'nin satır değerlerine ulaşmak istediğimiz için
                # y[k] ifadesini kullandık.
                # y[k][j]'deki j ise, y[k]'nın sütunlarına ulaşmamızı
                # sağlar.
            row.append(value)
        result.append(row)
    return result

Test:

print(multiply(_x, _y))
# [[12, 4, 9], [3, 16, 9]]

Bu yukarıdaki fonksiyondan dönen değeri list comprehension olarak kısaltabiliriz. Aşağıdaki fonksiyonun yaptığı işlem, yukarıdaki fonksiyonun yaptığı işlem ile aynıdır.

def multiply(x, y):
    if len(x[0]) != len(y):
        raise ValueError(
            f"Çarpım işlemi yapılamaz, çünkü 1. matrisin sütun "
            f"sayısı olan {x[0]}, ikinci matrisin satır sayısı "
            f"olan {len(y)} sayısına eşit değil."
        )
    return [
        [
            sum(x[i][k] * y[k][j] for k in range(len(x[0]))) 
            for j in range(len(y[0]))
        ] 
        for i in range(len(x))
    ]

Not: Tabi Python’da matris çarpımı yapmak için böyle bir fonksiyon kullanmak yerine numpy.dot fonksiyonunu kullanmak daha avantajlı.

8 Beğeni