Numpy數據的操作 * dot() multiply() 的區別


 

使用numpy時,跟matlab不同:

1、* dot() multiply()

對於array來說,* 和 dot()運算不同

*是每個元素對應相乘

dot()是矩陣乘法

對於matrix來說,* 和 multiply() 運算不同

* 是矩陣乘法

multiply()  是每個元素對應相乘

 

A B為array   MA MB為matrix

multiply(MA, MB)對應元素相乘

dot(MA, MB)矩陣乘法

 

注意:對應元素相乘時,矩陣大小必須相同;矩陣相乘時,矩陣大小要滿足矩陣相乘要求。

 
 
 

dot運算

numpy官方文檔上所寫:

  • 如果 a和 b都是 1-D arrays,它的作用是計算內積。(不進行復共軛)
>>> np.dot(3, 4) 12 
>>> np.dot([2j, 3+3j], [2j, 3j]) (-13+9j) 
  • 如果 a和 b是 2-D arrays, 作用是矩陣的乘積, a和 b的維數要滿足矩陣乘積維數要求,此時推薦使用 matmul或 a @ b
>>> a = [[1, 0], [0, 1]] >>> b = [[4, 1], [2, 2]] >>> np.dot(a, b) array([[4, 1], [2, 2]]) 
  • 如果 a或 b是 0-D (標量), 等價於 multiply,推薦使用 numpy.multiply(a, b)或 a * b
  • 如果 a是 N-D array 且 b是 1-D array, 作用是在a和 b的最后一個軸上進行sum product運算。
>>> a = array([[[ 1., 2., 3., 4.], [ 5., 6., 7., 8.], [ 9., 10., 11., 12.]], [[ 1., 2., 3., 4.], [ 5., 6., 7., 8.], [ 9., 10., 11., 12.]]]) >>> b = np.array([1,2,3,4]) >>>np.dot(a, b) array([[ 30., 70., 110.], [ 30., 70., 110.]]) 
  • 如果a是 N-D array 且 b是 M-D array (M>=2), 作用是在a的最后一個軸上和b的倒數第二個軸上進行sum product,即 :
dot(a, b)[i,j,k,m] = sum(a[i,j,:] * b[k,:,m])
>>> a = np.arange(3*4*5*6).reshape((3,4,5,6)) >>> b = np.arange(3*4*5*6)[::-1].reshape((5,4,6,3)) >>> np.dot(a, b)[2,3,2,1,2,2] 499128 >>> sum(a[2,3,2,:] * b[1,2,:,2]) 499128 

*運算

對於ndarray, * 作用的是進行element-wise乘積,必要時需要broadcast,作用同np.multipy

>>> a = np.array(range(6)).reshape((2,3)) >>> b = np.array([1,0,1]) >>> a array([[0, 1, 2], [3, 4, 5]]) >>> b array([1, 0, 1]) >>> c= a*b >>> c array([[0, 0, 2], [3, 0, 5]]) >>> d = a*b.T >>> d array([[0, 0, 2], [3, 0, 5]]) 

而對於matrix,* 則表示矩陣相乘,運算必須保證矩陣相乘的法則:

>>> A=np.matrix(a) >>> B=np.matrix(b) >>> A matrix([[0, 1, 2], [3, 4, 5]]) >>> B matrix([[1, 0, 1]]) >>> C=A*B ValueError: shapes (2,3) and (1,3) not aligned: 3 (dim 1) != 1 (dim 0) #維數不匹配 >>> C=A*B.T >>> C matrix([[2], [8]]) 

multiply運算

函數原型是

numpy.multiply(x1, x2, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature, extobj]) = <ufunc 'multiply'> 

Returns:
y : ndarray
x1 和 x2的element-wise乘積,保證x1和x2有相同的維數,或者進行broadcast之后兩者有相同的維數

>>> np.multiply(2.0, 4.0) 8.0 >>> x1 = np.arange(9.0).reshape((3, 3)) >>> x2 = np.arange(3.0) >>> np.multiply(x1, x2) array([[ 0., 1., 4.], [ 0., 4., 10.], [ 0., 7., 16.]]) #要進行broadcast 
 



 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM