2013-03-28 45 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