2013-03-28 47 views
14

我尝试了解如何处理具有numpy的1D数组(向量在线性代数中)。在以下示例中,我产生两个numpy.array a和b:numpy:具有各种形状的1D数组

>>> import numpy as np 
>>> a = np.array([1,2,3]) 
>>> b = np.array([[1],[2],[3]]).reshape(1,3) 
>>> a.shape 
(3,) 
>>> b.shape 
(1, 3) 

对我来说,a和b具有根据线性代数定义相同的形状:1列,3列,但不能用于numpy的。

现在,numpy的点积:

>>> np.dot(a,a) 
14 
>>> np.dot(b,a) 
array([14]) 
>>> np.dot(b,b) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: objects are not aligned 

我有三个不同的输出。点(a,a)和点(b,a)有什么区别?为什么点(b,b)不起作用?

我也有一些differencies与点的产品:

>>> c = np.ones(9).reshape(3,3) 
>>> np.dot(a,c) 
array([ 6., 6., 6.]) 
>>> np.dot(b,c) 
array([[ 6., 6., 6.]]) 

回答

16

通知您不仅与一维数组工作:

In [6]: a.ndim 
Out[6]: 1 

In [7]: b.ndim 
Out[7]: 2 

所以,b是一个二维数组。 您也可以在b.shape的输出中看到:(1,3)表示两维,(3,)是一维。

np.dot的行为对于1D和2D阵列(从docs)不同:

对于2D阵列它相当于矩阵乘法,以及用于1D 阵列的内积矢量

这就是你得到不同结果的原因,因为你在混合一维和二维数组。由于b是二维数组,所以np.dot(b, b)在两个1x3矩阵上尝试矩阵乘法,失败。


随着一维数组,np.dot确实的矢量的内积:

In [44]: a = np.array([1,2,3]) 

In [45]: b = np.array([1,2,3]) 

In [46]: np.dot(a, b) 
Out[46]: 14 

In [47]: np.inner(a, b) 
Out[47]: 14 

随着2D阵列,它是一个矩阵乘法(1×3,从而3×X = 1×1,或3X1 X 1×3 = 3x3):

In [49]: a = a.reshape(1,3) 

In [50]: b = b.reshape(3,1) 

In [51]: a 
Out[51]: array([[1, 2, 3]]) 

In [52]: b 
Out[52]: 
array([[1], 
     [2], 
     [3]]) 

In [53]: np.dot(a,b) 
Out[53]: array([[14]]) 

In [54]: np.dot(b,a) 
Out[54]: 
array([[1, 2, 3], 
     [2, 4, 6], 
     [3, 6, 9]]) 

In [55]: np.dot(a,a) 
--------------------------------------------------------------------------- 
ValueError        Traceback (most recent call last) 
<ipython-input-55-32e36f9db916> in <module>() 
----> 1 np.dot(a,a) 

ValueError: objects are not aligned 
+0

感谢您的回答。那么,如果我想用numpy做一些线性代数,最好的做法是什么?转换所有我的矢量在2D numpy.array?我有点困惑于两种不同的形状...... – Marcel 2013-03-28 12:32:40

+0

我自己并没有做太多的线性代数,但我认为这取决于你想要做什么。只是矢量产品和其他简单的操作/计算,然后1D是好的。如果你想做矩阵计算等,你应该使用2D。 – joris 2013-03-28 13:26:56

+3

最好的策略是使用矢量和二维数组的一维数组来表示矩阵。阵列魔术主要需要像形状为“(1,3)”的二维数组的构造,但不是标准线性代数的东西。就线性代数而言,这将对应于1×3矩阵不太有用的对象。 – flonk 2013-03-28 13:54:32