SciPy/NumPy中向量的点积(出现ValueError:对象未对齐)
我刚开始学习SciPy,遇到了一些最基本的功能问题。
考虑下面这个标准向量:
In [6]: W=array([[1],[2]])
In [7]: print W
[[1]
[2]]
如果我理解得没错的话,这应该是SciPy中表示一个标准的2x1数学向量,像这样:
(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 个回答
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列的矩阵,那么你会得到和第一个例子一样的结果。
12
你应该使用 vdot
:这个函数的作用是“返回两个向量的点积”。它会把输入的参数压平,然后给出你想要的结果。对于你的例子:
>>> W = np.array([[1], [2]])
>>> np.vdot(W, W)
5
>>>
16
这里的关键是,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