Jaromjj
Jaromjj

Reputation: 326

Python Matrix Multiplication Variations

just asked a question about multiplying matrices and that can be found here, I have one more question though about multiplying matrices. Say I have the following matrices:

matrix_a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

matrix_b = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

How could I get a result like this:

[[1, 4, 9], [16, 25, 36], [49, 64, 81]]

...so that each element is basically being multiplied by the single corresponding element of the other array. Does anyone know how to do that?

Thanks guys!

Upvotes: 1

Views: 741

Answers (3)

Jim Factor
Jim Factor

Reputation: 1535

Since those lists are equal, you can just multiply it with itself. Here is a slightly verbose way to iterate the matrix and store the result in a new one.

matrix = [[1,2,3],[4,5,6],[7,8,9]]

result_matrix = [[],[],[]]

print (matrix)

for i in range(0, len(matrix)):
    for j in range(0,len(matrix[i])):
        result_matrix[i].append(matrix[i][j] * matrix[i][j])
print (result_matrix)

Ouput

[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
[[1, 4, 9], [16, 25, 36], [49, 64, 81]]

Upvotes: 0

Neapolitan
Neapolitan

Reputation: 2153

The numpy package provides an array object that can do both element-wise and matrix-wise calculations:

import numpy as np
matrix_a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
matrix_b = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

matrix_a*matrix_b
np.dot(matrix_a, matrix_b)

This outputs:

array([[ 1,  4,  9],
       [16, 25, 36],
       [49, 64, 81]])

array([[ 30,  36,  42],
       [ 66,  81,  96],
       [102, 126, 150]])

Numpy is available using pip install numpy or by using one of the numerical python distributions such as anaconda or pythonxy.

Upvotes: 0

unutbu
unutbu

Reputation: 879749

You could express the element-wise product (and matrix product) using list comprehensions, zip, and the * argument-unpacking operator:

matrix_a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]    
matrix_b = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

elementwise_product = [[ai*bi for ai, bi in zip(*rows)] 
                       for rows in zip(matrix_a, matrix_b)]    
print(elementwise_product)
# [[1, 4, 9], [16, 25, 36], [49, 64, 81]]

matrix_product = [[sum([ai*bi for ai, bi in zip(row_a, col_b)])
                   for col_b in zip(*matrix_b)]
                  for row_a in matrix_a]
print(matrix_product)
# [[30, 36, 42], [66, 81, 96], [102, 126, 150]]

Upvotes: 2

Related Questions