# Multiplying numpy arrays

I have written a function to multiply two numpy arrays.

def ra(self):
"""Multiply Rotation with initial Values"""
rva = self.r_array() * self.va_array()
rva = np.sum(rva, axis=1)  # Sum rows of Matrix
rva = np.array([[rva[0]],  # Transpose Matrix
[rva[1]],
[rva[2]]])


where:

• r_array has 3 rows and 3 columns
• va_array has 3 rows and 1 column

I feel like this should be able to be written in one line. However, self.r_array() * self.va_array() always returns a 3 x 3 array.

Any suggestions would be greatly appreciated.

Cheers

• stackoverflow.com/a/21563036 Use r_array.dot(va_array) or @ operator.
– aki
Jul 11 '20 at 6:06
• @Peilonrayz - Thank you for the welcome. My code did work as intended, hence why I posted it here and not at in Stack Overflow. I generated a workaround that produced the correct answer but was not elegant. The problem was that I did not know how to do this in one line. This was correctly answered below, however. Jul 11 '20 at 9:52
• So it does, my apologies. Jul 11 '20 at 9:59
• Questions like this are common on SO. Jul 21 '20 at 4:06

Actually the * operator does element-wise multiplication. So you need to use .dot() function to get the desired result.

Example :

import numpy as np

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

b =  np.array([[1]
,[2],
[3]])
print(a * b)
print(a.dot(b))


output :

[[ 1  2  3]
[ 8 10 12]
[21 24 27]]
[[14]
[32]
[50]]


Observe that when I have used * operator, every column in a is multiplied with b element-wise

• @sai-sreenivas - Thank you for the answer. That worked to get it down to one line. It was working as intended before (unlike was suggesting and thus I dispute that it was off-topic) but this has made it significantly more elegant. Jul 11 '20 at 9:55
• Why does this output different numbers to the OPs? OPs outputs 6, 30, 72 where yours outputs 14, 32, 50. Jul 11 '20 at 9:59
• May I know the reason for downvote? Jul 11 '20 at 10:09

A one liner:

 np.sum(r_array*va_array, axis=1, keepdims=True)


To match r_array@va_array, use va_array.T in the 1liner.