SciPy / NumPy中矢量的点积(得到ValueError:对象未对齐)

时间:2012-02-10 13:54:48

标签: python numpy scipy

我刚开始学习SciPy并且正在努力学习最基本的功能。

考虑以下标准向量:

In [6]: W=array([[1],[2]])

In [7]: print W
[[1]
 [2]]

如果我理解正确,这应该是标准2x1数学向量的SciPy表示,如下所示:

(1)    
(2)

此向量的点积应为1*1+2*2=5。但是,这在SciPy中不起作用:

In [16]: dot(W, W)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
/home/ingo/<ipython-input-16-961b62a82495> in <module>()
----> 1 dot(W, W)

ValueError: objects are not aligned

请注意以下工作。如果我没有记错的话,这应该是(1 2)形式的向量。

In [9]: V=array([1,2])

In [10]: print V
[1 2]

In [11]: dot(V, V)
Out[11]: 5

我的误解是什么?我做错了什么?

6 个答案:

答案 0 :(得分:13)

这里的关键是numpy / scipy在计算点积时尊重数组的形状。看看你的第一个例子,W是一个2x1数组:

In [7]: W=array([[1],[2]])

In [8]: print W.shape
------> print(W.shape)
(2, 1)
因此,有必要使用转置运算符来计算W的点(内)积:

In [9]: print dot(W.T,W)
------> print(dot(W.T,W))
[[5]]

In [10]: print np.asscalar(dot(W.T,W))
-------> print(np.asscalar(dot(W.T,W)))
5

答案 1 :(得分:10)

你应该使用vdot:“返回两个向量的点积。”此函数展平输入参数并提供您期望的结果。以你的例子:

>>> W = np.array([[1], [2]])
>>> np.vdot(W, W)
5
>>>

答案 2 :(得分:4)

在你的第一种情况下,numpy将矢量生成为二维数组,基本上是一个2乘1的矩阵。在那种情况下,不能采用点积,因为m-by-n矩阵只能用n-by-k矩阵点缀。解决方案是使用:

dot(W.T,W)

这与x.x有时写成x ^ T x的方式相同。

在第二种情况下,为了方便numpy正在生成一维数组而不是矩阵,因此点积具有简单的定义。如果您使用

生成1乘2矩阵
W = np.array([[1,2]])

然后你会得到与第一种情况相同的行为。

答案 3 :(得分:3)

你错误地传递了数组的形状:

>>> W = np.array([[1], [2]])
>>> W.shape
(2, 1)
>>> W = np.array([1, 2])
>>> W.shape
(2,)

正如您所观察到的,在np.dot的第二个定义上使用W按预期工作。要将2-d矩阵与自身对齐,当它不是方形时,必须转置:

>>> W = np.array([[1], [2]])
>>> np.dot(W, W.transpose())
array([[1, 2],
       [2, 4]])

transpose的快捷方式是W.T

请注意,输出的形状取决于您是从转置开始还是原始,如人们所期望的那样:

>>> np.dot(W.T, W)
array([[5]])
>>> np.dot(W.T, W).shape
(1, 1)

有关详情,请参阅numpy文档。

答案 4 :(得分:0)

这是两个数组的数组,而不是两个数组的数组。第一个可以被认为是一个矩阵:两行,每行一列。

第二个是正确的;它也为您提供正确的点积。相信你的眼睛;使用第二个。

答案 5 :(得分:0)

在第一个例子中,W是一个二维数组,而在最后一个(有效的一个)中,你只有1个暗淡。

Yon可以肯定第二种方式是正确的方法。