Search code examples
pythonarraysnumpymatrix-multiplicationmultiplication

multiplying large 2D numpy arrays


I would like to multyply the following matrices (using numpy) in the most efficient way.

This is the code for the matrixes:

a = np.array([[1, 5], [2, 6], [3, 7], [4, 8]])
m = np.array([[1, 0, 0, 1], [1, 0, 1, 0], [0, 1, 0, 1], [0, 1, 1, 1]])

These are the matrixes visualized better:

a:
[[1 5]
 [2 6]
 [3 7]
 [4 8]]

m:
[[1 0 0 1]
 [1 0 1 0]
 [0 1 0 1]
 [0 1 1 1]]

I want to multiply a by (the first column of matrix m), like this

   a    m[:,0]       x0

[[1 5]   [[1]      [[1 5]
 [2 6] *  [1]   =   [2 6]    
 [3 7]    [0]       [0 0]
 [4 8]]   [0]]      [0 0]

And then I want to multiply a by (the second column of matrix m), like this

a  *  m[:,1]    =   x1

And then 3rd and 4th column

a  *  m[:,2]    =   x2
a  *  m[:,3]    =   x3

And finally, I want to put the resulting matrices x0,x1,x2,x3 all in one matrix.

X = [x0, x1, x2, x3]

The size X in this example is 4 x 8.

The final result in this example is:

X = 

[[[1 5 0 0 0 0 1 5]
  [2 6 0 0 2 6 0 0]
  [0 0 3 7 0 0 3 7]
  [0 0 4 8 4 8 4 8]]

I would like to know how to do this with build-in functions of numpy, and using generators, instead of using 2 for loops, if it is possible.

This is just an example. In reality the matrixes have large dimensions and it is important that the multiplications are done as fast as possible.

Thank you


Solution

  • This is the answer that I was looking for. Thank you Yatu and hpaulj.

    X = m.T[...,None] * a
    for i in range(4):
        reshaped = np.hstack(X[i,:,:])
        reshaped_simpler = np.hstack(X)
    print (reshaped_simpler)
    

    I got the rest of the answer from the following link:

    reshape numpy 3D array to 2D

    I rearranged the for loop because I got a Warning regarding the generators going to be depricated in future versions of Numpy.