numpy matrix vector multiplication [duplicate]

Multi tool use
Multi tool use











up vote
116
down vote

favorite
32













This question already has an answer here:




  • how does multiplication differ for NumPy Matrix vs Array classes?

    7 answers




When I multiply two numpy arrays of sizes (n x n)*(n x 1), I get a matrix of size (n x n). Following normal matrix multiplication rules, a (n x 1) vector is expected, but I simply cannot find any information about how this is done in Python's Numpy module.



The thing is that I don't want to implement it manually to preserve the speed of the program.



Example code is shown below:



a = np.array([[ 5, 1 ,3], [ 1, 1 ,1], [ 1, 2 ,1]])
b = np.array([1, 2, 3])

print a*b
>>
[[5 2 9]
[1 2 3]
[1 4 3]]


What i want is:



print a*b
>>
[16 6 8]









share|improve this question















marked as duplicate by Valerij, Pharabus, timrau, BobTheBuilder, Steve Czetty Feb 5 '14 at 15:58


This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.



















    up vote
    116
    down vote

    favorite
    32













    This question already has an answer here:




    • how does multiplication differ for NumPy Matrix vs Array classes?

      7 answers




    When I multiply two numpy arrays of sizes (n x n)*(n x 1), I get a matrix of size (n x n). Following normal matrix multiplication rules, a (n x 1) vector is expected, but I simply cannot find any information about how this is done in Python's Numpy module.



    The thing is that I don't want to implement it manually to preserve the speed of the program.



    Example code is shown below:



    a = np.array([[ 5, 1 ,3], [ 1, 1 ,1], [ 1, 2 ,1]])
    b = np.array([1, 2, 3])

    print a*b
    >>
    [[5 2 9]
    [1 2 3]
    [1 4 3]]


    What i want is:



    print a*b
    >>
    [16 6 8]









    share|improve this question















    marked as duplicate by Valerij, Pharabus, timrau, BobTheBuilder, Steve Czetty Feb 5 '14 at 15:58


    This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.

















      up vote
      116
      down vote

      favorite
      32









      up vote
      116
      down vote

      favorite
      32






      32






      This question already has an answer here:




      • how does multiplication differ for NumPy Matrix vs Array classes?

        7 answers




      When I multiply two numpy arrays of sizes (n x n)*(n x 1), I get a matrix of size (n x n). Following normal matrix multiplication rules, a (n x 1) vector is expected, but I simply cannot find any information about how this is done in Python's Numpy module.



      The thing is that I don't want to implement it manually to preserve the speed of the program.



      Example code is shown below:



      a = np.array([[ 5, 1 ,3], [ 1, 1 ,1], [ 1, 2 ,1]])
      b = np.array([1, 2, 3])

      print a*b
      >>
      [[5 2 9]
      [1 2 3]
      [1 4 3]]


      What i want is:



      print a*b
      >>
      [16 6 8]









      share|improve this question
















      This question already has an answer here:




      • how does multiplication differ for NumPy Matrix vs Array classes?

        7 answers




      When I multiply two numpy arrays of sizes (n x n)*(n x 1), I get a matrix of size (n x n). Following normal matrix multiplication rules, a (n x 1) vector is expected, but I simply cannot find any information about how this is done in Python's Numpy module.



      The thing is that I don't want to implement it manually to preserve the speed of the program.



      Example code is shown below:



      a = np.array([[ 5, 1 ,3], [ 1, 1 ,1], [ 1, 2 ,1]])
      b = np.array([1, 2, 3])

      print a*b
      >>
      [[5 2 9]
      [1 2 3]
      [1 4 3]]


      What i want is:



      print a*b
      >>
      [16 6 8]




      This question already has an answer here:




      • how does multiplication differ for NumPy Matrix vs Array classes?

        7 answers








      python arrays numpy vector matrix






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Aug 12 '16 at 2:24









      tarzanbappa

      2,803104172




      2,803104172










      asked Feb 4 '14 at 20:43









      user3272574

      6822613




      6822613




      marked as duplicate by Valerij, Pharabus, timrau, BobTheBuilder, Steve Czetty Feb 5 '14 at 15:58


      This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.






      marked as duplicate by Valerij, Pharabus, timrau, BobTheBuilder, Steve Czetty Feb 5 '14 at 15:58


      This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.


























          1 Answer
          1






          active

          oldest

          votes

















          up vote
          189
          down vote



          accepted










          Simplest solution



          Use numpy.dot or a.dot(b). See the documentation here.



          >>> a = np.array([[ 5, 1 ,3], 
          [ 1, 1 ,1],
          [ 1, 2 ,1]])
          >>> b = np.array([1, 2, 3])
          >>> print a.dot(b)
          array([16, 6, 8])


          This occurs because numpy arrays are not matrices, and the standard operations *, +, -, / work element-wise on arrays. Instead, you could try using numpy.matrix, and * will be treated like matrix multiplication.





          Other Solutions



          Also know there are other options:





          • As noted below, if using python3.5+ the @ operator works as you'd expect:



            >>> print(a @ b)
            array([16, 6, 8])



          • If you want overkill, you can use numpy.einsum. The documentation will give you a flavor for how it works, but honestly, I didn't fully understand how to use it until reading this answer and just playing around with it on my own.



            >>> np.einsum('ji,i->j', a, b)
            array([16, 6, 8])



          • As of mid 2016 (numpy 1.10.1), you can try the experimental numpy.matmul, which works like numpy.dot with two major exceptions: no scalar multiplication but it works with stacks of matrices.



            >>> np.matmul(a, b)
            array([16, 6, 8])



          • numpy.inner functions the same way as numpy.dot for matrix-vector multiplication but behaves differently for matrix-matrix and tensor multiplication (see Wikipedia regarding the differences between the inner product and dot product in general or see this SO answer regarding numpy's implementations).



            >>> np.inner(a, b)
            array([16, 6, 8])

            # Beware using for matrix-matrix multiplication though!
            >>> b = a.T
            >>> np.dot(a, b)
            array([[35, 9, 10],
            [ 9, 3, 4],
            [10, 4, 6]])
            >>> np.inner(a, b)
            array([[29, 12, 19],
            [ 7, 4, 5],
            [ 8, 5, 6]])





          Rarer options for edge cases





          • If you have tensors (arrays of dimension greater than or equal to one), you can use numpy.tensordot with the optional argument axes=1:



            >>> np.tensordot(a, b, axes=1)
            array([16, 6, 8])


          • Don't use numpy.vdot if you have a matrix of complex numbers, as the matrix will be flattened to a 1D array, then it will try to find the complex conjugate dot product between your flattened matrix and vector (which will fail due to a size mismatch n*m vs n).







          share|improve this answer



















          • 10




            For anybody who finds this later, numpy support the matrix multiplication operator @.
            – Tyler Crompton
            Mar 31 '16 at 20:07






          • 1




            Thanks for this explanation. Nevertheless I cannot understand why numpy does this way...
            – decadenza
            Jul 22 '17 at 11:52


















          1 Answer
          1






          active

          oldest

          votes








          1 Answer
          1






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes








          up vote
          189
          down vote



          accepted










          Simplest solution



          Use numpy.dot or a.dot(b). See the documentation here.



          >>> a = np.array([[ 5, 1 ,3], 
          [ 1, 1 ,1],
          [ 1, 2 ,1]])
          >>> b = np.array([1, 2, 3])
          >>> print a.dot(b)
          array([16, 6, 8])


          This occurs because numpy arrays are not matrices, and the standard operations *, +, -, / work element-wise on arrays. Instead, you could try using numpy.matrix, and * will be treated like matrix multiplication.





          Other Solutions



          Also know there are other options:





          • As noted below, if using python3.5+ the @ operator works as you'd expect:



            >>> print(a @ b)
            array([16, 6, 8])



          • If you want overkill, you can use numpy.einsum. The documentation will give you a flavor for how it works, but honestly, I didn't fully understand how to use it until reading this answer and just playing around with it on my own.



            >>> np.einsum('ji,i->j', a, b)
            array([16, 6, 8])



          • As of mid 2016 (numpy 1.10.1), you can try the experimental numpy.matmul, which works like numpy.dot with two major exceptions: no scalar multiplication but it works with stacks of matrices.



            >>> np.matmul(a, b)
            array([16, 6, 8])



          • numpy.inner functions the same way as numpy.dot for matrix-vector multiplication but behaves differently for matrix-matrix and tensor multiplication (see Wikipedia regarding the differences between the inner product and dot product in general or see this SO answer regarding numpy's implementations).



            >>> np.inner(a, b)
            array([16, 6, 8])

            # Beware using for matrix-matrix multiplication though!
            >>> b = a.T
            >>> np.dot(a, b)
            array([[35, 9, 10],
            [ 9, 3, 4],
            [10, 4, 6]])
            >>> np.inner(a, b)
            array([[29, 12, 19],
            [ 7, 4, 5],
            [ 8, 5, 6]])





          Rarer options for edge cases





          • If you have tensors (arrays of dimension greater than or equal to one), you can use numpy.tensordot with the optional argument axes=1:



            >>> np.tensordot(a, b, axes=1)
            array([16, 6, 8])


          • Don't use numpy.vdot if you have a matrix of complex numbers, as the matrix will be flattened to a 1D array, then it will try to find the complex conjugate dot product between your flattened matrix and vector (which will fail due to a size mismatch n*m vs n).







          share|improve this answer



















          • 10




            For anybody who finds this later, numpy support the matrix multiplication operator @.
            – Tyler Crompton
            Mar 31 '16 at 20:07






          • 1




            Thanks for this explanation. Nevertheless I cannot understand why numpy does this way...
            – decadenza
            Jul 22 '17 at 11:52















          up vote
          189
          down vote



          accepted










          Simplest solution



          Use numpy.dot or a.dot(b). See the documentation here.



          >>> a = np.array([[ 5, 1 ,3], 
          [ 1, 1 ,1],
          [ 1, 2 ,1]])
          >>> b = np.array([1, 2, 3])
          >>> print a.dot(b)
          array([16, 6, 8])


          This occurs because numpy arrays are not matrices, and the standard operations *, +, -, / work element-wise on arrays. Instead, you could try using numpy.matrix, and * will be treated like matrix multiplication.





          Other Solutions



          Also know there are other options:





          • As noted below, if using python3.5+ the @ operator works as you'd expect:



            >>> print(a @ b)
            array([16, 6, 8])



          • If you want overkill, you can use numpy.einsum. The documentation will give you a flavor for how it works, but honestly, I didn't fully understand how to use it until reading this answer and just playing around with it on my own.



            >>> np.einsum('ji,i->j', a, b)
            array([16, 6, 8])



          • As of mid 2016 (numpy 1.10.1), you can try the experimental numpy.matmul, which works like numpy.dot with two major exceptions: no scalar multiplication but it works with stacks of matrices.



            >>> np.matmul(a, b)
            array([16, 6, 8])



          • numpy.inner functions the same way as numpy.dot for matrix-vector multiplication but behaves differently for matrix-matrix and tensor multiplication (see Wikipedia regarding the differences between the inner product and dot product in general or see this SO answer regarding numpy's implementations).



            >>> np.inner(a, b)
            array([16, 6, 8])

            # Beware using for matrix-matrix multiplication though!
            >>> b = a.T
            >>> np.dot(a, b)
            array([[35, 9, 10],
            [ 9, 3, 4],
            [10, 4, 6]])
            >>> np.inner(a, b)
            array([[29, 12, 19],
            [ 7, 4, 5],
            [ 8, 5, 6]])





          Rarer options for edge cases





          • If you have tensors (arrays of dimension greater than or equal to one), you can use numpy.tensordot with the optional argument axes=1:



            >>> np.tensordot(a, b, axes=1)
            array([16, 6, 8])


          • Don't use numpy.vdot if you have a matrix of complex numbers, as the matrix will be flattened to a 1D array, then it will try to find the complex conjugate dot product between your flattened matrix and vector (which will fail due to a size mismatch n*m vs n).







          share|improve this answer



















          • 10




            For anybody who finds this later, numpy support the matrix multiplication operator @.
            – Tyler Crompton
            Mar 31 '16 at 20:07






          • 1




            Thanks for this explanation. Nevertheless I cannot understand why numpy does this way...
            – decadenza
            Jul 22 '17 at 11:52













          up vote
          189
          down vote



          accepted







          up vote
          189
          down vote



          accepted






          Simplest solution



          Use numpy.dot or a.dot(b). See the documentation here.



          >>> a = np.array([[ 5, 1 ,3], 
          [ 1, 1 ,1],
          [ 1, 2 ,1]])
          >>> b = np.array([1, 2, 3])
          >>> print a.dot(b)
          array([16, 6, 8])


          This occurs because numpy arrays are not matrices, and the standard operations *, +, -, / work element-wise on arrays. Instead, you could try using numpy.matrix, and * will be treated like matrix multiplication.





          Other Solutions



          Also know there are other options:





          • As noted below, if using python3.5+ the @ operator works as you'd expect:



            >>> print(a @ b)
            array([16, 6, 8])



          • If you want overkill, you can use numpy.einsum. The documentation will give you a flavor for how it works, but honestly, I didn't fully understand how to use it until reading this answer and just playing around with it on my own.



            >>> np.einsum('ji,i->j', a, b)
            array([16, 6, 8])



          • As of mid 2016 (numpy 1.10.1), you can try the experimental numpy.matmul, which works like numpy.dot with two major exceptions: no scalar multiplication but it works with stacks of matrices.



            >>> np.matmul(a, b)
            array([16, 6, 8])



          • numpy.inner functions the same way as numpy.dot for matrix-vector multiplication but behaves differently for matrix-matrix and tensor multiplication (see Wikipedia regarding the differences between the inner product and dot product in general or see this SO answer regarding numpy's implementations).



            >>> np.inner(a, b)
            array([16, 6, 8])

            # Beware using for matrix-matrix multiplication though!
            >>> b = a.T
            >>> np.dot(a, b)
            array([[35, 9, 10],
            [ 9, 3, 4],
            [10, 4, 6]])
            >>> np.inner(a, b)
            array([[29, 12, 19],
            [ 7, 4, 5],
            [ 8, 5, 6]])





          Rarer options for edge cases





          • If you have tensors (arrays of dimension greater than or equal to one), you can use numpy.tensordot with the optional argument axes=1:



            >>> np.tensordot(a, b, axes=1)
            array([16, 6, 8])


          • Don't use numpy.vdot if you have a matrix of complex numbers, as the matrix will be flattened to a 1D array, then it will try to find the complex conjugate dot product between your flattened matrix and vector (which will fail due to a size mismatch n*m vs n).







          share|improve this answer














          Simplest solution



          Use numpy.dot or a.dot(b). See the documentation here.



          >>> a = np.array([[ 5, 1 ,3], 
          [ 1, 1 ,1],
          [ 1, 2 ,1]])
          >>> b = np.array([1, 2, 3])
          >>> print a.dot(b)
          array([16, 6, 8])


          This occurs because numpy arrays are not matrices, and the standard operations *, +, -, / work element-wise on arrays. Instead, you could try using numpy.matrix, and * will be treated like matrix multiplication.





          Other Solutions



          Also know there are other options:





          • As noted below, if using python3.5+ the @ operator works as you'd expect:



            >>> print(a @ b)
            array([16, 6, 8])



          • If you want overkill, you can use numpy.einsum. The documentation will give you a flavor for how it works, but honestly, I didn't fully understand how to use it until reading this answer and just playing around with it on my own.



            >>> np.einsum('ji,i->j', a, b)
            array([16, 6, 8])



          • As of mid 2016 (numpy 1.10.1), you can try the experimental numpy.matmul, which works like numpy.dot with two major exceptions: no scalar multiplication but it works with stacks of matrices.



            >>> np.matmul(a, b)
            array([16, 6, 8])



          • numpy.inner functions the same way as numpy.dot for matrix-vector multiplication but behaves differently for matrix-matrix and tensor multiplication (see Wikipedia regarding the differences between the inner product and dot product in general or see this SO answer regarding numpy's implementations).



            >>> np.inner(a, b)
            array([16, 6, 8])

            # Beware using for matrix-matrix multiplication though!
            >>> b = a.T
            >>> np.dot(a, b)
            array([[35, 9, 10],
            [ 9, 3, 4],
            [10, 4, 6]])
            >>> np.inner(a, b)
            array([[29, 12, 19],
            [ 7, 4, 5],
            [ 8, 5, 6]])





          Rarer options for edge cases





          • If you have tensors (arrays of dimension greater than or equal to one), you can use numpy.tensordot with the optional argument axes=1:



            >>> np.tensordot(a, b, axes=1)
            array([16, 6, 8])


          • Don't use numpy.vdot if you have a matrix of complex numbers, as the matrix will be flattened to a 1D array, then it will try to find the complex conjugate dot product between your flattened matrix and vector (which will fail due to a size mismatch n*m vs n).








          share|improve this answer














          share|improve this answer



          share|improve this answer








          edited Jan 10 at 18:46

























          answered Feb 4 '14 at 20:46









          wflynny

          11.5k32943




          11.5k32943








          • 10




            For anybody who finds this later, numpy support the matrix multiplication operator @.
            – Tyler Crompton
            Mar 31 '16 at 20:07






          • 1




            Thanks for this explanation. Nevertheless I cannot understand why numpy does this way...
            – decadenza
            Jul 22 '17 at 11:52














          • 10




            For anybody who finds this later, numpy support the matrix multiplication operator @.
            – Tyler Crompton
            Mar 31 '16 at 20:07






          • 1




            Thanks for this explanation. Nevertheless I cannot understand why numpy does this way...
            – decadenza
            Jul 22 '17 at 11:52








          10




          10




          For anybody who finds this later, numpy support the matrix multiplication operator @.
          – Tyler Crompton
          Mar 31 '16 at 20:07




          For anybody who finds this later, numpy support the matrix multiplication operator @.
          – Tyler Crompton
          Mar 31 '16 at 20:07




          1




          1




          Thanks for this explanation. Nevertheless I cannot understand why numpy does this way...
          – decadenza
          Jul 22 '17 at 11:52




          Thanks for this explanation. Nevertheless I cannot understand why numpy does this way...
          – decadenza
          Jul 22 '17 at 11:52



          Nq6t,0Pijr,zEF U58rYlzNJmIjG8Nlwp,czGlKnchquD ZF9O
          TVDTrQlKX9rZ0Kk,GPPsu,45hdOv L,h30

          Popular posts from this blog

          How to pass form data using jquery Ajax to insert data in database?

          Guess what letter conforming each word

          Run scheduled task as local user group (not BUILTIN)