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
2 Answers 2
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
-
1\$\begingroup\$ @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. \$\endgroup\$GalacticPonderer– GalacticPonderer2020年07月11日 09:55:26 +00:00Commented Jul 11, 2020 at 9:55
-
2\$\begingroup\$ Why does this output different numbers to the OPs? OPs outputs 6, 30, 72 where yours outputs 14, 32, 50. \$\endgroup\$2020年07月11日 09:59:47 +00:00Commented Jul 11, 2020 at 9:59
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.
r_array.dot(va_array)
or@
operator. \$\endgroup\$