luigui2906
luigui2906

Reputation: 67

Dot product columns by rows python - numpy

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.

Upvotes: 1

Views: 188

Answers (1)

hpaulj
hpaulj

Reputation: 231355

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]]])

Upvotes: 1

Related Questions