取矩阵的点积时显示 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,)
,基于numpy
broadcasting,numpy
找不到广播方式B_transformed
为了执行 matmul
和 A
.
为了得到想要的输出,你需要
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 个数字,它们的区别也可能很重要。
我希望将两个 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,)
,基于numpy
broadcasting,numpy
找不到广播方式B_transformed
为了执行 matmul
和 A
.
为了得到想要的输出,你需要
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 个数字,它们的区别也可能很重要。