2017-04-05 100 views
0

的產品,我理解numpy的點功能背後的工作有一個問題,broadcasting.Below是片斷我想了解Np個陣列點矢量和陣列

a=np.array([[1,2],[3,5]])

如果我們檢查的形狀一個 a.shape 的將是(2,2)

b=np.array([3,6])b.shape is (2,)

問題1:是b列向量或行向量?在提供輸入時,似乎b是行向量,但隨後形狀將其顯示爲具有2行的列向量。在我的理解中,錯誤是什麼?

現在如果做 a.dot(b) 它導致 array([15,39])

問題2:按矩陣乘法如果am*n然後b必須n*k並且由於a是2 * 2然後b必須是2 * 1。這是否證實b是列向量,否則如果它是行向量,則不可能進行矩陣乘法,但點積的輸出確實給出根據矩陣乘法的值,考慮b作爲列向量並將其廣播

現在b.dot(a)也可以在 array([21,36])和 這個吹我mind.How他們在檢查矩陣乘法矢量的兼容性以及他們是如何計算的結果嗎? 在至少一個場景中,它們必須拋出乘法的不兼容維度的錯誤。但它沒有顯示,它們正在計算兩種情況下的結果。

+0

一個= np.array([[1,2],[3,5 ])這必須是a = np.array([[1,2],[3,5]])。陣列產品和矩陣產品是不同的。我建議你通過差異 – LethalProgrammer

回答

4

該numpy的被編程的方式意味着,一維數組,shape=(n,),作爲任一列或基於在點積的位置的行向量處理。爲了更好地解釋這一考慮的情況下,與非對稱排列比較對稱陣:

>>>a=numpy.arange(6) 
>>>a.shape=(2,3) 
>>>a 
array([0,1,2] 
     [3,4,5]) 

>>>b=numpy.arange(9) 
>>>b.shape=(3,3) 
>>>b 
array([0,1,2] 
     [3,4,5] 
     [6,7,8]) 

然後定義一個(3)行向量:

>>>c=numpy.arange(3) 
>>>c 
array([0,1,2]) 
>>>c.shape 
(3,) 

現在,我們希望交流要罰款,2×3用3x1打點,但加上一個錯誤。這樣做在Python中,你會發現,a.dot(c)會產生(2)陣列和c.dot(a)會引發錯誤:

>>>d=a.dot(c) 
d.shape=(2,) 
>>>e=c.dot(a) 
ValueError: shapes (3,) and (2,3) not aligned: 3 (dim 0) != 2 (dim 0) 

什麼numpy的已經在這裏做了檢查C的只有維度對的第一維a,沒​​有檢查最近的尺寸c對a。根據numpy 一維數組只有一維,並且所有檢查都是針對該維度完成的。因此,我們發現b.dot(c)檢查b的第二維對c的一維,並且c.dot(b)檢查c的一維對b的第一維。因此,他們都工作

>>>f=b.dot(c) 
>>>f 
array([ 5, 14, 23]) 

>>>g=c.dot(b) 
>>>g 
array([15, 18, 21]) 

爲了避免這種情況,你必須你的行或列向量的第二個維度。在這個例子中,你可以明確地說c.shape=(3,1)爲列向量或c.shape=(1,3)爲行向量。

>>>c.shape=(3,1) 
>>>h=c.dot(b) 
ValueError: shapes (3,1) and (3,3) not aligned: 1 (dim 1) != 3 (dim 0) 


>>>c.shape=(1,3) 
>>>i=c.dot(b) 
>>>i 
array([[15, 18, 21]]) 

從該採取的一點是,: 根據numpy的,行和列向量具有兩個維度

+1

'A的最後(或唯一)暗淡與B'的倒數第二'在大多數情況下描述'點(A,B)'。 – hpaulj

0

起初,a=np.array([[1,2],[3,5])爲了改變a=np.array([[1,2],[3,5]])工作

甲numpy的陣列是值的網格,所有相同類型的,並且是由非負整數的元組索引。維數是陣列的等級;數組的形狀是一個整數的元組,它給出了每個維度上數組的大小。

回答你的問題b形狀是2,這是行大小。

a = np.array([1, 2, 3]) 
a.shape 
(3,) #here 3 is row size its one dimensional array. 

點運算符:

numpy.dot

實施例:

np.dot(2, 4) 
8 

與2D陣列又如:

>>> a = [[1, 0], [0, 1]] 
>>> b = [[4, 1], [2, 2]] 
>>> np.dot(a, b) 
array([[4, 1], 
     [2, 2]]) 
  • 的點函數來計算矢量的內積,通過矩陣相乘的矢量,並且相乘的矩陣。

  • 點有兩種形式的numpy的模塊中的功能和作爲陣列的實例方法對象

For 2-D arrays it is equivalent to matrix multiplication, and for 1-D arrays to inner product of vectors (without complex conjugation). For N dimensions it is a sum product over the last axis of a and the second-to-last of b:

他們如何計算?

b.dot(a) is also possible and results in array([21,36])and this blew my mind.How are they checking the compatibility of the vector for matrix multiplication and how do they calculate?

這是基本的matrix product

 a 
    array([[1, 2], #2D array 
      [3, 5]]) 
    >>> b 
    array([3, 6]) #1D array 

(7*3 6*6) = ([21, 36])