1. 程式人生 > >【python入門】multiply用法

【python入門】multiply用法

multiply(a,b)就是個乘法,如果a,b是兩個陣列,那麼對應元素相乘

先來看個例子:

為什麼上面的multiply(a, b)是這種結果,原因是multiply是ufunc函式

當我們使用ufunc函式對兩個陣列進行計算時,ufunc函式會對這兩個陣列的對應元素進行計算,因此它要求這兩個陣列有相同的大小(shape相同)。如果兩個陣列的shape不同的話,會進行如下的廣播(broadcasting)處理:

  1. 讓所有輸入陣列都向其中shape最長的陣列看齊,shape中不足的部分都通過在前面加1補齊
  2. 輸出陣列的shape是輸入陣列shape的各個軸上的最大值
  3. 如果輸入陣列的某個軸和輸出陣列的對應軸的長度相同或者其長度為1時,這個陣列能夠用來計算,否則出錯
  4. 當輸入陣列的某個軸的長度為1時,沿著此軸運算時都用此軸上的第一組值

上述4條規則理解起來可能比較費勁,讓我們來看一個實際的例子。

先建立一個二維陣列a,其shape為(6,1):
>>> a = np.arange(0, 60, 10).reshape(-1, 1)
>>> a
array([[ 0], [10], [20], [30], [40], [50]])
>>> a.shape
(6, 1)
再建立一維陣列b,其shape為(5,):
>>> b = np.arange(0, 5)
>>> b
array([0, 1, 2, 3, 4]) >>> b.shape (5,)

計算a和b的和,得到一個加法表,它相當於計算a,b中所有元素組的和,得到一個shape為(6,5)的陣列:

>>> c = a + b
>>> c
array([[ 0,  1,  2,  3,  4],
       [10, 11, 12, 13, 14],
       [20, 21, 22, 23, 24],
       [30, 31, 32, 33, 34],
       [40, 41, 42, 43, 44],
       [50, 51, 52, 53, 54]])
>>> c.shape (6, 5)

由於a和b的shape長度(也就是ndim屬性)不同,根據規則1,需要讓b的shape向a對齊,於是將b的shape前面加1,補齊為(1,5)。相當於做了如下計算:

>>> b.shape=1,5
>>> b
array([[0, 1, 2, 3, 4]])

這樣加法運算的兩個輸入陣列的shape分別為(6,1)和(1,5),根據規則2,輸出陣列的各個軸的長度為輸入陣列各個軸上的長度的最大值,可知輸出陣列的shape為(6,5)。

由於b的第0軸上的長度為1,而a的第0軸上的長度為6,因此為了讓它們在第0軸上能夠相加,需要將b在第0軸上的長度擴充套件為6,這相當於:

>>> b = b.repeat(6,axis=0)
>>> b
array([[0, 1, 2, 3, 4],
       [0, 1, 2, 3, 4],
       [0, 1, 2, 3, 4],
       [0, 1, 2, 3, 4],
       [0, 1, 2, 3, 4],
       [0, 1, 2, 3, 4]])

由於a的第1軸的長度為1,而b的第一軸長度為5,因此為了讓它們在第1軸上能夠相加,需要將a在第1軸上的長度擴充套件為5,這相當於:

>>> a = a.repeat(5, axis=1)
>>> a
array([[ 0,  0,  0,  0,  0],
       [10, 10, 10, 10, 10],
       [20, 20, 20, 20, 20],
       [30, 30, 30, 30, 30],
       [40, 40, 40, 40, 40],
       [50, 50, 50, 50, 50]])

經過上述處理之後,a和b就可以按對應元素進行相加運算了。

當然,numpy在執行a+b運算時,其內部並不會真正將長度為1的軸用repeat函式進行擴充套件,如果這樣做的話就太浪費空間了

這樣,就能知道為什麼multiply(a, b)是這種結果了 from:http://blog.csdn.net/qq_18433441/article/details/54868889