поэлементные операции матрицы в python
предположим, у меня есть матрица так:
matrix1 = [[11,12,13,14,15,16,17],[21,22,23,24,25,26,27],[31,32,33,34,35,36,37],
[41,42,43,44,45,46,47],[51,52,53,54,55,56,57],[61,62,63,64,65,66,67],
[71,72,73,74,75,76,77]]
и я хочу сделать функцию, которая будет принимать две матрицы и делать точечное умножение. (не используя библиотеки numpy)
Я видел некоторые вещи при использовании zip, но это, похоже, не работает для меня. Я думаю, это потому, что мой список состоит из списков, а не из одного списка.
мой код:
def pointwise_product(a_matrix, a_second_matrix):
# return m[i][j] = a_matrix[i][j] x a_second_matrix[i][j]
return [i*j for i,j in zip(a_matrix,a_second_matrix)]
Matrix1 может быть подключен как оба аргумента здесь. вторая функция с именем display_matrix будет возьмите эту функцию и отобразите каждый элемент списков в новых строках, но это выходит за рамки этого вопроса.
Я предполагаю, что мне понадобятся некоторые понимания списка или лямбда-функции, но я слишком новичок в python, чтобы полностью их понять.
2 ответов
вам понадобится вложенное понимание, так как у вас есть 2D-список. Вы можете использовать следующее:
[[i * j for i, j in zip(*row)] for row in zip(matrix1, matrix2)]
это приведет к следующему для вашего примера (matrix1 * matrix1
):
[[121, 144, 169, 196, 225, 256, 289],
[441, 484, 529, 576, 625, 676, 729],
[961, 1024, 1089, 1156, 1225, 1296, 1369],
[1681, 1764, 1849, 1936, 2025, 2116, 2209],
[2601, 2704, 2809, 2916, 3025, 3136, 3249],
[3721, 3844, 3969, 4096, 4225, 4356, 4489],
[5041, 5184, 5329, 5476, 5625, 5776, 5929]]
насчет
def pw(m1, m2):
"""
Given two lists of lists m1 and m2 of the same size,
returns the point-wise multiplication of them, like matrix point-wise multiplication
"""
m = m1[:]
for i in range(len(m)):
for j in range(len(m[i])):
m[i][j] = m1[i][j]*m2[i][j]
return m
m = [[1,2,3], [4,5,6]]
assert([[1*1, 2*2, 3*3], [4*4, 5*5, 6*6]] == pw(m,m))
есть ли причина для преждевременной оптимизации? Если да, то используйте numpy.