我想计算点积的 N 组,对于每个组,假设它是一个(4,3)矩阵,称为 x_i。于是我将这N个矩阵向量化为一个(N,4,3)矩阵,如:

 [[[1,2,3],
   [4,5,6],
   [7,8,9],
   [0,1,2]],
     ...
   [7,2,2],
   [4,2,4],
   [7,1,9],
   [3,1,2]]].  #  #N matrices

如果我分别计算 x_i 和 x_i.T 的每个点积:
np.dot(x_i, x_i.T)

它将得到一个 (4,4) 矩阵。

但是矢量化之后如何计算这些呢?

最终结果应该是 (N,4,4)。

最佳答案

In [31]: x = np.arange(5*12).reshape(5,4,3)
In [32]: [email protected](0,2,1)
Out[32]:
array([[[    5,    14,    23,    32],
        [   14,    50,    86,   122],
        [   23,    86,   149,   212],
        [   32,   122,   212,   302]],

       [[  509,   626,   743,   860],
        [  626,   770,   914,  1058],
        [  743,   914,  1085,  1256],
        [  860,  1058,  1256,  1454]],

       [[ 1877,  2102,  2327,  2552],
        [ 2102,  2354,  2606,  2858],
        [ 2327,  2606,  2885,  3164],
        [ 2552,  2858,  3164,  3470]],

       [[ 4109,  4442,  4775,  5108],
        [ 4442,  4802,  5162,  5522],
        [ 4775,  5162,  5549,  5936],
        [ 5108,  5522,  5936,  6350]],

       [[ 7205,  7646,  8087,  8528],
        [ 7646,  8114,  8582,  9050],
        [ 8087,  8582,  9077,  9572],
        [ 8528,  9050,  9572, 10094]]])
In [33]: _.shape
Out[33]: (5, 4, 4)

检查
In [34]: x[0,...].dot(x[0,...].T)
Out[34]:
array([[  5,  14,  23,  32],
       [ 14,  50,  86, 122],
       [ 23,  86, 149, 212],
       [ 32, 122, 212, 302]])
@matmul 在最后 2 个维度上进行点积,同时将第一个维度视为“i”维度。
x.tanspose(0,2,1) 切换最后 2 个维度,保持第一个不变。对于二维数组 x.transpose()x.transpose(1,0) 。这就是你表达的 x_i.T

dot 一样, a@b 的关键是 a 的最后一个维度与 b 的第二个到最后一个维度一起工作。

关于python - 如何在 Python 中矢量化点积?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51953748/

10-12 20:16