2012-02-10 39 views
13

我刚开始学习SciPy,并且正在努力使用最基本的功能。SciPy/NumPy中的矢量点积(获取ValueError:对象未对齐)

考虑以下标准的矢量:

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

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

如果我理解正确的话,这应该是一个标准的2×数学矢量的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 

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

+0

使用*数组*时,您可以忘记“行”和“列”。注意,当你使用*矩阵时,你需要它。 – astrojuanlu 2012-02-12 16:01:20

回答

11

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

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 
0

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

第二个是正确的;它也给你正确的点产品。相信你的眼睛;使用第二个。

+0

好吧,V = array([1,2])是一个具有两行一列或一列两行的向量吗? – Ingo 2012-02-10 14:08:53

+0

@Ingo,它是一行,没有列的矢量。这是一个一维矢量。 'numpy'区分形状'(2,)'和形状'(2,1)'或形状'(1,2)'的数组和矩阵。 – senderle 2012-02-10 14:14:00

+0

这是一个行向量:1行,2列。 OR列向量:2行,1列。取决于它的使用方式。这是数学家会说的 – duffymo 2012-02-10 14:30:52

0

在第一个例子中,W是一个2维的数组,而在最后一个(工作的)中,你只有1个dim。

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

4

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

dot(W.T,W) 

这与如何将x.x写成x^T x相同。

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

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

生成一个1乘2的矩阵,那么您将获得与第一种情况相同的行为。

3

你错了有关阵列的你在通过形状:

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

正如您所观察到的,对W作品的第二个定义使用np.dot预期。成点的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文档的更多。

9

您应该使用vdot:“返回两个向量的点积。”该函数将输入参数平滑并给出您期望的结果。例如:

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