Произведение матриц (не могу разобраться, что делаю не так)

    def func(array_1,array_2):
    result = 0
    arr_1 = len(array_1)
    arr_2 = len(array_1[0])
    arr_3 = len(array_2)
    arr_4 = len(array_2[0])
    if arr_2 != arr_3:
        pass
    else:
        arr_5 = [[0]*arr_1]*arr_4
        for i in range(arr_1):
            for j in range(arr_4):
                for k in range(arr_2):
                    result = a[i][k] * b[k][j]
                arr_5[i][j] = result
        return arr_5


a = [[1, 2, 3],  #столбец
     [4, 5, 6]
     ]

b = [[7, 4],    #сторока
     [5, 1],
     [4, 8]]

print(func(a,b))

Ответы (2 шт):

Автор решения: CrazyElf

У вас сразу две ошибки в коде.

arr_5 = [[0]*arr_1]*arr_4

Тут у вас получается arr_4 копии списка [0]*arr_1. То есть ссылки на одни и те же вложенные списки, а не независимые друг от друга списки. Лучше создавать нулевую матрицу так, чтобы её элементы были точно независимыми друг от друга объектами:

arr_5 = [[[0] for _ in range(arr_1)] for _ in range(arr_4)]

Вторая ошибка тут:

for k in range(arr_2):
    result = a[i][k] * b[k][j]
arr_5[i][j] = result

Видите - result заново присваивается на каждой итерации цикла, а он должен в этом цикле накапливаться:

result = 0
for k in range(arr_2):
    result += a[i][k] * b[k][j]
arr_5[i][j] = result

→ Ссылка
Автор решения: Tehnorobot

Воспользуйтесь лучше библиотекой numpy. Я списки a и b преобразовал в numpy-объект, но лучше сразу создавать объекты numpy.

import numpy as np

a = np.asarray([[1, 2, 3],  #столбец(преобразуем список списков в numpy-объект)
     [4, 5, 6]
     ])

b = np.asarray([[7, 4],    #сторока(преобразуем список списков в numpy-объект)
     [5, 1],
     [4, 8]])
     
print(np.dot(a, b)) # матричное умножение

Подробнее про numpy и его возможности здесь

→ Ссылка