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.
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.
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.
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]])
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With