I want to do the element-wise outer product of two 2d arrays in numpy.
A.shape = (100, 3) # A numpy ndarray
B.shape = (100, 5) # A numpy ndarray
C = element_wise_outer_product(A, B) # A function that does the trick
C.shape = (100, 3, 5) # This should be the result
C[i] = np.outer(A[i], B[i]) # This should be the result
A naive implementation can the following.
tmp = []
for i in range(len(A):
outer_product = np.outer(A[i], B[i])
tmp.append(outer_product)
C = np.array(tmp)
A better solution inspired from stack overflow.
big_outer = np.multiply.outer(A, B)
tmp = np.swapaxes(tmp, 1, 2)
C_tmp = [tmp[i][i] for i in range(len(A)]
C = np.array(C_tmp)
I'm looking for a vectorized implementation that gets rid the for loop. Does anyone have an idea? Thank you!
Extend
A
andB
to3D
keeping their first axis aligned and introducing new axes along the third and second ones respectively withNone/np.newaxis
and then multiply with each other. This would allowbroadcasting
to come into play for a vectorized solution.Thus, an implementation would be -
We could shorten it a bit by using
ellipsis
for A's ::,:
and skip listing the leftover last axis withB
, like so -As another vectorized approach we could also use
np.einsum
, which might be more intuitive once we get past the string notation syntax and consider those notations being representatives of the iterators involved in a naive loopy implementation, like so -