【问题标题】:Numpy array dot productNumpy 数组点积
【发布时间】:2019-01-04 08:32:33
【问题描述】:

我们都知道向量之间的点积必须返回一个标量:

import numpy as np
a = np.array([1,2,3])
b = np.array([3,4,5])
print(a.shape) # (3,)
print(b.shape) # (3,)
a.dot(b) # 26
b.dot(a) # 26

完美。但是为什么如果我们使用“真实”(看看Difference between numpy.array shape (R, 1) and (R,))行向量或列向量,numpy 点积会在维度上返回错误?

arow = np.array([[1,2,3]])
brow = np.array([[3,4,5]])
print(arow.shape) # (1,3)
print(brow.shape) # (1,3)
arow.dot(brow) # ERROR
brow.dot(arow) # ERROR

acol = np.array([[1,2,3]]).reshape(3,1)
bcol = np.array([[3,4,5]]).reshape(3,1)
print(acol.shape) # (3,1)
print(bcol.shape) # (3,1)
acol.dot(bcol) # ERROR
bcol.dot(acol) # ERROR

【问题讨论】:

  • 您忘记发布(或阅读?)整个错误消息。它会告诉您它尝试匹配的维度。 dot 尽管名称是矩阵产品。文档清楚地表明,一维数组的处理是一种特殊情况。
  • 如果ab 不是1d,则dot 是:“a 的最后一个轴和b 的倒数第二个轴的和积”。 (3,1) 可以与 (1,3) 一起使用,但不能与 (3,1) 一起使用。

标签: python numpy dot-product


【解决方案1】:

因为通过显式添加第二个维度,您不再使用向量,而是使用二维矩阵。取矩阵的点积时,积的内部维度必须匹配。

因此,您需要转置其中一个矩阵。你转置哪一个将决定结果的含义和形状。

1x3 乘以 3x1 矩阵将产生 1x1 矩阵(即标量)。这是内积。 3x1 乘以 1x3 矩阵将产生 3x3 外积。

【讨论】:

  • 那么stackoverflow.com/questions/22053050/…的答案应该被审查?
  • @arj。这个答案肯定非常好,但与您的问题并不完全相关。它将帮助您了解 3 元素数组在内存中始终是相同的东西,无论您给它什么形状或维数。它还应该可以帮助您了解矩阵维度如何用于乘法。
  • 您的 1x1 内部正在像您的 3x3 外部一样进行数学运算,'ij,jk->ik` 在einsum 表示法中。 j 维度在一种情况下为 3,在另一种情况下为 1。
【解决方案2】:

您也可以使用@ 运算符,它实际上是矩阵乘法。 在这种情况下,以及在点积中,您需要注意矩阵的大小(ndarray 应该始终与 dim 兼容),但它更具可读性:

>>> a = np.array([1,2,3])
>>> a.shape
(3,)
>>> b= np.array([[1,2,3]])
>>> b.shape
(1, 3)
>>> a@b
Traceback (most recent call last):
  File "<input>", line 1, in <module>
ValueError: shapes (3,) and (1,3) not aligned: 3 (dim 0) != 1 (dim 0)
>>> a@b.T
array([14])

【讨论】:

  • b@a也可以
【解决方案3】:

你也可以这样做

import numpy as npy
Vector1 = npy.array([0,2,3])
Vector2 = npy.array([3,5,1])
print("Dot Product of", Vector1, "and", Vector2,)
def DotProduct(a,b):
  NetValue = 0
  for i in range(len(a)):
   NetValue += a[i]*b[i]
 return NetValue
ans = DotProduct(Vector1,Vector2)
print("The answer is =",ans)

【讨论】:

  • 感谢您为 SO 所做的努力。但是,您没有回答问题。问题是为什么会出错,而您正在通过定制的点积绕过错误。下次请仔细阅读问题。
猜你喜欢
  • 2021-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-27
相关资源
最近更新 更多