为什么numpy
可以将2x2
矩阵乘以1x2
行向量?
import numpy as np
I = np.array([[1.0, 0.0], [0.0, 1.0]])
x = np.array([2.0,3.0])
In: I * x
Out: array([[ 2., 0.], [ 0., 3.]])
转置x
也没有意义。行向量保持行向量?
In: x.T
Out: array([ 2., 3.])
从数学的角度来看,这种表现非常混乱。
答案 0 :(得分:7)
Numpy数组是不是向量。或者重要的矩阵。他们是阵列。
它们可以使用来表示向量,矩阵,张量或任何你想要的东西。然而,numpy的天才是代表数组,并让用户决定它们的含义。
在数组上定义的一个操作是(逐项)乘法。此外,通过广播,您可以通过“扩展”来操作不同形状的阵列。它在缺失的维度中,所以你的乘法实际上是:(逐项)乘法:
[[1.0, 0.0], [0.0, 1.0]] * [[2.0, 2.0], [3.0, 3.0]]
如果你想使用点积,在matricial意义上,你应该使用.dot
方法,它正是这样做:将其输入解释为向量/矩阵/张量,并做点积。 / p>
答案 1 :(得分:1)
如果你检查了x
的形状,你会看到(2,)这意味着numpy数组:
In [58]: x.shape
Out[58]: (2,)
如果您需要1x2矢量,可以使用reshape
:
x_vec = x.reshape(2,1)
In [64]: x_vec.shape
Out[64]: (2, 1)
然后你可以使用numpy dot
方法进行乘法运算:
In [68]: I.dot(x_vec)
Out[68]:
array([[ 2.],
[ 3.]])
但dot
也可以不重塑:
In [69]: I.dot(x)
Out[69]: array([ 2., 3.])
您也可以使用np.matmul
来执行此操作:
In [73]: np.matmul(I, x_vec)
Out[73]:
array([[ 2.],
[ 3.]])
答案 2 :(得分:1)
如果您使用的是Python 3.5,则可以使用@
运算符。
In [2]: I@x
Out[2]: array([ 2., 3.])