按行按点排列产品列python-numpy

时间:2019-01-28 23:41:15

标签: python numpy

我试图在nx3向量中取出每一行相对于自身的点积。让我更好地解释一下:我需要从nx3到nx3x3数组。

如果我具有以下条件:

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

我想得到的是这样:

第一个元素:

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

第二个元素:

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

所以我的最终数组将是:

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)

我知道我可以使用for循环来做到这一点,但我想必须有一种更快,更直接地做到这一点的方法。速度对于我所需要的至关重要。

希望我对自己的解释足够正确。预先谢谢你。

1 个答案:

答案 0 :(得分:1)

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

这不是dot产品;没有产品的总和。相反,它更像是outer产品,增加了尺寸。 numpy可以很好地做到这一点:

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