1

I am trying to take out the dot product of each row against itself in a nx3 vector. Let me explain a little better: what I need is to go from a nx3 to a nx3x3 array.

If i have the following:

A = np.array([[1, 2, 2],
              [4, 2, 3])

I would like to get what it would be:

First element:

np.dot(A[0].reshape(3,1), A[0].reshape(1,3)) = array([[1, 2, 2], [2, 4, 4], [2, 4, 4]])

Second element:

np.dot(A[1].reshape(3,1), A[1].reshape(1,3)) = array([[16, 8, 12], [8, 4, 6], [12, 6, 9]])

So my final array would be:

result = array([[[ 1, 2,  2], 
                 [ 2, 4,  4], 
                 [ 2, 4,  4]],
                [[16, 8, 12], 
                 [ 8, 4,  6], 
                 [12, 6,  9]])

result.shape = (2, 3, 3)

I know I can do this with a for loop but I guess there must be a way to do it faster and more directly. Speed is vital for what I need.

Hope I explained myself correctly enough. Thank you in advance.

1 Answer 1

1
In [301]: A = np.array([[1, 2, 2],
     ...:               [4, 2, 3]])
     ...: 
     ...: 

This isn't a dot product; there's no summing of products. Rather it's more like an outer product, increasing the number of dimensions. numpy with broadcasting does this nicely:

In [302]: A[:,:,None]*A[:,None,:]
Out[302]: 
array([[[ 1,  2,  2],
        [ 2,  4,  4],
        [ 2,  4,  4]],

       [[16,  8, 12],
        [ 8,  4,  6],
        [12,  6,  9]]])
Sign up to request clarification or add additional context in comments.

1 Comment

Thanks @hpaulj, this is exactly what I wanted to do

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.