2017-06-18 75 views
0

我正在尋找關於乘法因子上的廣播規則和numpy.dot方法的一些說明。我創建了兩個形狀(2,)和(3,)的數組,它們可以通過添加一個新的軸(3,1形狀)相乘,但它不能通過np.dot方法,即使添加了一個新軸並轉動變成(3,1)形狀。下面是一些小測試。Numpy dot形狀(2,)(3,1)給出了錯誤,但乘法不是

x_1 = np.random.rand(2,) 
print(x_1) 
x_2 = np.random.rand(3,) 
print(x_2) 
> [ 0.48362051 0.55892736] 
> [ 0.16988562 0.09078386 0.04844093] 

x_8 = np.dot(x_1, x_2[:, np.newaxis]) 
> ValueError: shapes (2,) and (3,1) not aligned: 2 (dim 0) != 3 (dim 0) 

x_9 = x_1 * x_2[:, np.newaxis] 
print(x_9) 
> [[ 0.47231067 0.30899592] 
    [ 0.17436521 0.11407352] 
    [ 0.01312074 0.00858387]] 

x__7 = x_1[:, np.newaxis] * x_2[:, np.newaxis] 
> ValueError: operands could not be broadcast together with shapes (2,1) (3,1) 

我明白np.dot的(2,1)&(1,3)的作品,但爲什麼不(2,1)&(3,1),因爲廣播規則二說,兩個維度當它們中的一個是1時是兼容的。因此,如果它的一個維度是1,那麼np.dot應該工作,或者我理解了第二個規則是錯誤的?此外,爲什麼X_9工作(乘法)而不是x_8(np.dot),兩者都是相同的形狀。

+1

「廣播」規則不適用於「點」。 – hpaulj

+0

你對2個1d數組有什麼期待'dot'?或者2擴展到2d?內在產品? Outter? – hpaulj

+0

@hpaulj我正在處理的等式δ= W f(h)試圖獲得內積。最終的標量值。所以我正在努力在np.dot方法上使用numpy乘法來更好地理解,並且我應該使用np.dot和numpy乘法。任何建議/經驗要知道嗎?並且,謝謝,在廣播文檔中沒有發現np.dot不適用於他們。 –

回答

1

np.dot用於矩陣 - 矩陣乘法(其中列向量可以被認爲是具有一列的矩陣並且行向量是具有一行的矩陣)。 *(乘法)用於在其中一個參數是標量的情況下進行標量乘法,否則進行廣播。所以廣播規則不適用於np.dot。 x_9工作,因爲,作爲廣播規則的兩個數組這裏https://docs.scipy.org/doc/numpy-1.12.0/user/basics.broadcasting.html

工作時指出,NumPy的逐元素的它們的形狀進行比較。它從尾隨的維度開始,並朝着前進的方向前進。兩個維度是兼容時

  1. 它們相等,或
  2. 它們中的一個是1

所以X_1你(只)尺寸,(這是2)是與所述兼容x_2的最後一個維度(因爲您添加了新的維度,因此爲1),其餘維度爲3.

相關問題