python numpy中multiply與*及matul 的區(qū)別說明
1、對于矩陣(matrix)而言
multiply是對應(yīng)元素相乘,而 * 、np.matmul() 函數(shù) 與 np.dot()函數(shù) 相當(dāng)于矩陣乘法(矢量積),對應(yīng)的列數(shù)和行數(shù)必須滿足乘法規(guī)則;如果希望以數(shù)量積的方式進(jìn)行,則必須使用 np.multiply 函數(shù),如下所示:
a = np.mat([[1, 2, 3, 4, 5]]) b = np.mat([[1,2,3,4,5]]) c=np.multiply(a,b) print(c)
結(jié)果是
[[ 1 4 9 16 25]]
a = np.mat([[1, 2, 3, 4, 5]])
b = np.mat([ [1],[2],[3],[4],[5] ] )
d=a*b
print(d) #a是shape(1,5),b是shape(5,1),結(jié)果是一個(gè)實(shí)數(shù)
結(jié)果是
[[55]]
2、對于數(shù)組(Array)而言
* 與 multiply均表示的是數(shù)量積(即對應(yīng)元素的乘積相加),np.matmul與np.dot表示的是矢量積(即矩陣乘法)。
代碼:
if __name__ == '__main__':
w = np.array([[1,2],[3,4]])
x = np.array([[1,3],[2,4]])
w1 = np.array([[1,2],[3,4]])
x1 = np.array([[1,2]])
w_mat = np.mat([[1,2],[3,4]])
x_mat = np.mat([[1,3],[2,4]])
print("x1.shape:",np.shape(x1))
w_x_start = w*x
w_x_dot = np.dot(w,x)
x_w_dot = np.dot(x,w)
w_x_matmul = np.matmul(w, x)
x_w_matmul = np.matmul(x, w)
w_x_multiply = np.multiply(w,x)
x_w_multiply = np.multiply(x, w)
#w1_x1_matmul = np.matmul(w1, x1)
x1_w1_matmul = np.matmul(x1, w1)
w_x_mat_matmul = np.matmul(w_mat,x_mat)
x_w_mat_matmul = np.matmul(x_mat, w_mat)
w_x_mat_start = w_mat*x_mat
x_w_mat_start = x_mat*w_mat
w_x_mat_dot = np.dot(w_mat,x_mat)
x_w_mat_dot = np.dot(x_mat,w_mat)
w_x_mat_multiply = np.multiply(w_mat,x_mat)
x_w_mat_multiply = np.multiply(x_mat,w_mat)
print("W.shape:", np.shape(w))
print("x.shape:", np.shape(x))
print("w_x_start.shape:", np.shape(w_x_start))
print("w_x_dot.shape:", np.shape(w_x_dot))
print("x_w_dot.shape:", np.shape(x_w_dot))
print("x1_w1_matmul.shape::", np.shape(x1_w1_matmul))
print("做Array數(shù)組運(yùn)算時(shí):", '\n')
print("w_x_start:", w_x_start)
print("w_x_dot:", w_x_dot)
print("x_w_dot:", x_w_dot)
print("w_x_matmul:", w_x_matmul)
print("x_w_matmul:", x_w_matmul)
print("w_x_multiply:", w_x_multiply)
print("x_w_multiply:", x_w_multiply)
# print("w1_x1_matmul:", w1_x1_matmul)
print("x1_w1_matmul:", x1_w1_matmul)
print("做matrix矩陣運(yùn)算時(shí):", '\n')
print("w_x_mat_start:", w_x_mat_start)
print("x_w_mat_start:", x_w_mat_start)
print("x_w_mat_dot:", x_w_mat_dot)
print("w_x_mat_dot:", w_x_mat_dot)
print("w_x_mat_matmul:",w_x_mat_matmul)
print("x_w_mat_matmul:", x_w_mat_matmul)
print("w_x_mat_multiply",w_x_mat_multiply)
print("x_w_mat_multiply", x_w_mat_multiply)
x1.shape: (1, 2) W.shape: (2, 2) x.shape: (2, 2) w_x_start.shape: (2, 2) w_x_dot.shape: (2, 2) x_w_dot.shape: (2, 2) x1_w1_matmul.shape:: (1, 2) 做Array數(shù)組運(yùn)算時(shí): w_x_start: [[ 1 6] [ 6 16]] w_x_dot: [[ 5 11] [11 25]] x_w_dot: [[10 14] [14 20]] w_x_matmul: [[ 5 11] [11 25]] x_w_matmul: [[10 14] [14 20]] w_x_multiply: [[ 1 6] [ 6 16]] x_w_multiply: [[ 1 6] [ 6 16]] x1_w1_matmul: [[ 7 10]] 做matrix矩陣運(yùn)算時(shí): w_x_mat_start: [[ 5 11] [11 25]] x_w_mat_start: [[10 14] [14 20]] x_w_mat_dot: [[10 14] [14 20]] w_x_mat_dot: [[ 5 11] [11 25]] w_x_mat_matmul: [[ 5 11] [11 25]] x_w_mat_matmul: [[10 14] [14 20]] w_x_mat_multiply [[ 1 6] [ 6 16]] x_w_mat_multiply [[ 1 6] [ 6 16]]
python中轉(zhuǎn)置的優(yōu)先級高于乘法運(yùn)算 例如:
a = np.mat([[2, 3, 4]])
b = np.mat([[1,2,3]] )
d=a*b.T
print(d)
結(jié)果是
[[20]]
其中a為1行3列,b也為1行3列,按理來說直接計(jì)算a*b是不能運(yùn)算,但是計(jì)算d=a*b.T是可以的,結(jié)果是20,說明運(yùn)算順序是先轉(zhuǎn)置再計(jì)算a與b轉(zhuǎn)置的積,*作為矩陣乘法,值得注意的在執(zhí)行*運(yùn)算的時(shí)候必須符合行列原則。
numpy中tile()函數(shù)的用法
b = tile(a,(m,n)):即是把a(bǔ)數(shù)組里面的元素復(fù)制n次放進(jìn)一個(gè)數(shù)組c中,然后再把數(shù)組c復(fù)制m次放進(jìn)一個(gè)數(shù)組b中,通俗地講就是將a在行方向上復(fù)制m次,在列方向上復(fù)制n次。
python中的 sum 和 np.sum 是不一樣的,如果只寫sum的話,表示的是數(shù)組中對應(yīng)的維度相加,如果寫 np.sum 的話,表示一個(gè)數(shù)組中的維數(shù)和列數(shù)上的數(shù)都加在一起。
如下圖所示:

補(bǔ)充:總結(jié):numpy中三個(gè)乘法運(yùn)算multiply,dot和* 的區(qū)別
引言:
本人在做機(jī)器學(xué)習(xí)的練習(xí)1的時(shí)候,時(shí)常拋出錯(cuò)誤:

Not aligned是什么意思呢?
意思是兩個(gè)矩陣相乘無意義。
線性代數(shù)中mxn 和 nxp的矩陣才能相乘,其結(jié)果是mxp的矩陣。
出錯(cuò)源代碼:
def gradientDescent(X,y,theta,alpha,iteration):
colunms = int(theta.ravel().shape[1])
thetai = np.matrix(np.zeros(theta.shape))
cost = np.zeros(iteration)
for i in range(iteration):
error = X*theta.T-y
for j in range(colunms):
a = np.sum(error*X[:,j])/len(X) ########## error!
thetai[0,j] = thetai[0,j] - alpha*a
theta = thetai
cost[i] = computeCost(X, y, theta)
return theta,cost
這里error是一個(gè)nx1的矩陣,theta.T也是一個(gè)nx1的矩陣。
而矩陣之間*運(yùn)算符表示矩陣乘法。我們這里想實(shí)現(xiàn)矩陣的對應(yīng)元素相乘,因此應(yīng)該用np.multiply()實(shí)現(xiàn)。
總結(jié):
(讀者可使用簡單的舉例自行驗(yàn)證)
1.*用法:
矩陣與矩陣:矩陣乘法(matrix)
數(shù)組與數(shù)組:對應(yīng)位置相乘(array)
2.np.dot()用法:
矩陣相乘的結(jié)果
3.np.multiply()用法:
數(shù)組、矩陣都得到對應(yīng)位置相乘。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python實(shí)現(xiàn)的連接mssql數(shù)據(jù)庫操作示例
這篇文章主要介紹了Python實(shí)現(xiàn)的連接mssql數(shù)據(jù)庫操作,結(jié)合實(shí)例形式分析了Python安裝pymssql模塊以及基于pymssql模塊連接sql2008 R2數(shù)據(jù)庫的具體操作技巧,需要的朋友可以參考下2018-08-08
Python編寫可視化界面的詳細(xì)教程(Python+PyCharm+PyQt)
最近開始學(xué)習(xí)Python,但只限于看理論,編幾行代碼,覺得沒有意思,就想能不能用Python編寫可視化的界面,遂查找了相關(guān)資料,發(fā)現(xiàn)了PyQt,所以本文介紹了Python+PyCharm+PyQt編寫可視化界面的詳細(xì)教程,需要的朋友可以參考下2024-07-07
Python Django切換MySQL數(shù)據(jù)庫實(shí)例詳解
這篇文章主要介紹了Python Django切換MySQL數(shù)據(jù)庫實(shí)例詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07
caffe的python接口deploy生成caffemodel分類新的圖片
這篇文章主要為大家介紹了caffe的python接口生成deploy文件學(xué)習(xí)以及用訓(xùn)練好的模型(caffemodel)來分類新的圖片示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06
Python線程池ThreadPoolExecutor使用方式
這篇文章主要介紹了Python線程池ThreadPoolExecutor使用方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-02-02
Python接口測試之如何使用requests發(fā)起請求
這篇文章主要介紹了Python接口測試之如何使用requests發(fā)起請求問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06

