取矩阵的点积时显示 ValueError

Showing ValueError while taking dot product of matrix

我希望将两个 numpy 矩阵 A 和 B_transformed 相乘:

    A = 
     [[-1.910095  ]
      [-1.20056174]
      [-0.77669163]
      [ 0.62406999]
      [ 1.1471159 ]
      [ 2.11616247]]

    B = 
      [[ 0.70710678 -0.70710678]
       [ 0.70710678  0.70710678]]

     B_transformed = B[1,:]
                   = [0.70710678 0.70710678]

我试过了:

product = np.dot(A,B_transformed)

但是我得到 ValueError:

ValueError: shapes (6,1) and (2,) not aligned:

根据矩阵规则,(6,1) X (1,2) 是允许的。那为什么我会得到 valueError?

期望的输出

product = [[-1.35064113 -1.35064113]
           [-0.84892534 -0.84892534]
           [-0.54920392 -0.54920392]
           [ 0.44128412  0.44128412]
           [ 0.81113343  0.81113343]
           [ 1.49635283  1.49635283]]

因为B_transformed的shape是(2,),基于numpybroadcastingnumpy找不到广播方式B_transformed为了执行 matmulA.

为了得到想要的输出,你需要

np.matmul(A,B_transformed[None,:])

B_transformed[None,:] 会将 B_transformed 重塑为 (1,2)

你的 B_transformed 应该是 [[0.70710678, 0.70710678]] 而不是 [0.70710678, 0.70710678]

你的数组形状:

In [38]: A.shape
Out[38]: (6, 1)
In [39]: B.shape
Out[39]: (2, 2)
In [40]: B[1,:]
Out[40]: array([0.70710678, 0.70710678])
In [41]: _.shape
Out[41]: (2,)

A (6,1) 和 (2,) 可以相乘,产生 (6,2)。这是与广播的逐元素乘法。它实际上是一个 outer product.

In [42]: A*B[1,:]
Out[42]: 
array([[-1.35064112, -1.35064112],
       [-0.84892535, -0.84892535],
       [-0.54920392, -0.54920392],
       [ 0.44128412,  0.44128412],
       [ 0.81113343,  0.81113343],
       [ 1.49635283,  1.49635283]])

它可以作为矩阵乘积来完成,前提是第二个数组是 (1,2) 形状。使用列表索引 [1] 可以为我们做到这一点。或者我们可以用 None.

添加维度
In [43]: A.dot(B[[1],:])
Out[43]: 
array([[-1.35064112, -1.35064112],
       [-0.84892535, -0.84892535],
       [-0.54920392, -0.54920392],
       [ 0.44128412,  0.44128412],
       [ 0.81113343,  0.81113343],
       [ 1.49635283,  1.49635283]])

dot 不添加前导维度;只有逐元素广播可以做到这一点。

在形状 (2,)、(1,2) 和 (2,1) 的情况下,即使它们都包含相同的 2 个数字,它们的区别也可能很重要。