SciPy/NumPy中向量的点积(出现ValueError:对象未对齐)

18 投票
6 回答
26747 浏览
提问于 2025-04-17 12:46

我刚开始学习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

撰写回答