Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Matrix Multiplication in pure Python?

I'm trying to multiply two matrices together using pure Python. Input (X1 is a 3x3 and Xt is a 3x2):

X1 =  [[1.0016, 0.0, -16.0514],         [0.0, 10000.0, -40000.0],         [-16.0514, -40000.0, 160513.6437]] Xt =  [(1.0, 1.0),         (0.0, 0.25),         (0.0, 0.0625)] 

where Xt is the zip transpose of another matrix. Now here is the code:

def matrixmult (A, B):     C = [[0 for row in range(len(A))] for col in range(len(B[0]))]     for i in range(len(A)):         for j in range(len(B[0])):             for k in range(len(B)):                 C[i][j] += A[i][k]*B[k][j]     return C 

The error that python gives me is this:

IndexError: list index out of range.

Now I'm not sure if Xt is recognised as an matrix and is still a list object, but technically this should work.

like image 874
Ammar Avatar asked May 08 '12 23:05

Ammar


People also ask

How fast is matrix multiplication in Python?

Our plain Python solution takes 11.77 seconds to run, while using Numpy to perform the multiplications and generate the matrices takes 0.0097 seconds to run. Additionally, if we use the Numpy function power instead, we cut the runtime to 0.00065 seconds.

What is matrix multiplication operator in Python?

The @ (at) operator is intended to be used for matrix multiplication. No builtin Python types implement this operator. The @ operator was introduced in Python 3.5. @= is matrix multiplication followed by assignment, as you would expect.


1 Answers

If you really don't want to use numpy you can do something like this:

def matmult(a,b):     zip_b = zip(*b)     # uncomment next line if python 3 :      # zip_b = list(zip_b)     return [[sum(ele_a*ele_b for ele_a, ele_b in zip(row_a, col_b))               for col_b in zip_b] for row_a in a]  x = [[1,2,3],[4,5,6],[7,8,9],[10,11,12]] y = [[1,2],[1,2],[3,4]]  import numpy as np # I want to check my solution with numpy  mx = np.matrix(x) my = np.matrix(y)        

Result:

>>> matmult(x,y) [[12, 18], [27, 42], [42, 66], [57, 90]] >>> mx * my matrix([[12, 18],         [27, 42],         [42, 66],         [57, 90]]) 
like image 97
Akavall Avatar answered Sep 22 '22 06:09

Akavall