Произведение матриц (не могу разобраться, что делаю не так)
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 и его возможности здесь