在Python中计算两个numpy行数组(向量)的点积给出了一个形状向量

问题描述:

我试图了解numpy在尝试调用两个行向量的点积时是如何工作的。在Python中计算两个numpy行数组(向量)的点积给出了一个形状向量

我有这样的代码:

X = np.array([[1,2,3]]) 
THETA = np.array([[1,2,3]]) 
print X.dot(THETA) 

这给我的错误:

ValueError: shapes (1,3) and (1,3) not aligned: 3 (dim 1) != 1 (dim 0)

我认为你可以采取两种行向量的点积然而得到:

x1*theta1 + x2*theta2 + x3*theta3 

而且这也会转移到点积的两列向量。

怪异的一部分是,我不得不采取第二矩阵的转置,以实际使用的点积:

print X.dot(THETA.T) 
array([[14]]) 

但是,我没想到这会实际工作,以及为什么它将工作,而不是只做点行操作。任何人都可以帮助我理解发生了什么?线性代数中的某些规则是否早已忘记?

+0

你为什么代表矢量作为二维数组?矢量是1D。取下额外的一组括号。 – Will

+1

@将它计算机器学习任务的感知器决策边界的公式的一部分。我的猜测是我们必须有一个正确的形状供以后计算。但是,我看到他使用代码“X.dot(THETA.T)”来计算线性响应,并且我很难理解为什么他必须转置它。 – Alex

dot对于2D输入是矩阵乘法,而不是点乘积。你所看到的只是矩阵乘法正常规则的结果。如果你想要一个向量的点积,最简单的方法是使用一维向量,没有多余的第二个维度:

X = np.array([1, 2, 3]) 
THETA = np.array([1, 2, 3]) 
print X.dot(THETA) 

dot -ting两个一维数组需要一个点积和产生一个标量的结果。

如果您想要使用行列向量,那么通过矩阵乘法的标准规则,您需要将N乘1的数组(一个行向量)乘以一个N乘1的数组(一列向量)得到1乘1的结果,NumPy会给你一个1乘1的数组而不是标量。

您看到的对齐错误是因为您试图将一维矢量表示为二维数组。

In [1]: import numpy as np 

In [2]: X = np.array([1,2,3]) 

In [3]: THETA = np.array([1,2,3]) 

In [4]: print X.dot(THETA) 
14 

In [5]: print X.dot(THETA.T) 
14 

和:

x1*theta1 + x2*theta2 + x3*theta3 = 
1*1 + 2*2 + 3*3 = 
14