numpy矩陣乘法中的multiply,matmul和dot的使用
用numpy做矩陣運(yùn)算時(shí),少不了用到矩陣乘法。本文幫你迅速區(qū)分multiply, matmul和dot的區(qū)別。
numpy官方文檔中的說明:(想深入了解可以一戳)
multiply: https://docs.scipy.org/doc/numpy/reference/generated/numpy.multiply.html
dot: https://docs.scipy.org/doc/numpy/reference/generated/numpy.dot.html
matmul:https://docs.scipy.org/doc/numpy/reference/generated/numpy.matmul.html
1. multiply(矩陣點(diǎn)乘)
先說說更簡(jiǎn)單的multiply,如果兩個(gè)維度完全一樣的矩陣用multiply做乘法,那么它們只是進(jìn)行對(duì)應(yīng)位置元素之間的乘法,得到一個(gè)同樣維度的矩陣輸出。這就是所謂的element-wise product。
import numpy as np a = np.array([[0,1,2], [1,2,3], [3,4,5]]) b = np.array([[1,1,2], [2,2,1], [1,1,2]]) print(np.multiply(a, b))
輸出:
array([[ 0, 1, 4], [ 2, 4, 3], [ 3, 4, 10]])
看這個(gè)栗子,應(yīng)該十分好理解multiply。但是,如果你認(rèn)為multiply只能對(duì)同樣維度的矩陣之間相乘,那你就 t/o-o\ simple了。
如果3x3的矩陣和3x1的矩陣用multiply相乘會(huì)怎樣呢?繼續(xù)看栗子:
import numpy as np a = np.array([[0, 1, 2], [1, 2, 3], [3, 4, 5]]) b = np.array([1, 2, 3]) print(np.multiply(a, b))
輸出:
array([[ 0, 2, 6],
[ 1, 4, 9],
[ 3, 8, 15]])
相當(dāng)于用b依次乘以a的每一行。記住,multiply是滿足交換律的。(a和b互換位置結(jié)果不變)
對(duì)于3x3的矩陣a,可以用3x1的矩陣與它相乘,也可以用1x3的矩陣與它相乘。還可以用它乘以一個(gè)常數(shù):
import numpy as np a = np.array([[0, 1, 2], [1, 2, 3], [3, 4, 5]]) print(np.multiply(a, 3))
相當(dāng)于a中各個(gè)元素乘以3。
2. dot(矩陣叉乘)
dot就是矩陣叉乘,MxN矩陣乘以NxC矩陣會(huì)得到一個(gè)MxC的矩陣。對(duì)于2D情況下的dot,等同于matmul,也等同于運(yùn)算符@。
用一張圖很好解釋:
>>> a = [[1, 0], [0, 1]] >>> b = [[4, 1], [2, 2]] >>> np.dot(a, b) array([[4, 1], [2, 2]]) >>> a@b array([[4, 1], [2, 2]])
3. matmul
matmul不支持標(biāo)量乘法,在2D矩陣乘法中,其效果與dot一樣。
在N維矩陣乘法中(N>=3),體現(xiàn)出與dot不一樣的算法。
>>> a = np.ones([9, 5, 7, 4]) >>> c = np.ones([9, 5, 4, 3]) >>> np.dot(a, c).shape (9, 5, 7, 9, 5, 3) >>> np.matmul(a, c).shape (9, 5, 7, 3) >>> # n is 7, k is 4, m is 3
總結(jié)
1. dot和multiply對(duì)于標(biāo)量相乘,效果一樣,而matmul不支持標(biāo)量相乘:
>>>dot(3,3) >>>9 >>>multiply(3,3) >>>9 >>>matmul(3,3) error!
2. 對(duì)于2D矩陣相乘,dot和matmul效果一樣, 并且這倆都不滿足交換律。通常建議優(yōu)先使用matmul:
from numpy import * a = arange(9).reshape(3,3) b = arange(3).reshape(1,3) print(dot(b,a)) print(matmul(b,a))
輸出:
[[15 18 21]]
[[15 18 21]]
到此這篇關(guān)于numpy矩陣乘法中的multiply,matmul和dot的使用的文章就介紹到這了,更多相關(guān)numpy矩陣乘法中的multiply,matmul和dot內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python實(shí)現(xiàn)MySql數(shù)據(jù)庫交互的示例
本文主要介紹了Python實(shí)現(xiàn)MySql數(shù)據(jù)庫交互的示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01Python實(shí)現(xiàn)的彩票機(jī)選器實(shí)例
這篇文章主要介紹了Python實(shí)現(xiàn)彩票機(jī)選器的方法,可以模擬彩票號(hào)碼的隨機(jī)生成功能,需要的朋友可以參考下2015-06-06Python Django 命名空間模式的實(shí)現(xiàn)
這篇文章主要介紹了Python Django 命名空間模式的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08python selenium 執(zhí)行完畢關(guān)閉chromedriver進(jìn)程示例
今天小編就為大家分享一篇python selenium 執(zhí)行完畢關(guān)閉chromedriver進(jìn)程示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-11-11Django項(xiàng)目開發(fā)中cookies和session的常用操作分析
這篇文章主要介紹了Django項(xiàng)目開發(fā)中cookies和session的常用操作,結(jié)合實(shí)例形式分析了Django中cookie與session的檢查、設(shè)置、獲取等常用操作技巧,需要的朋友可以參考下2018-07-07Python實(shí)現(xiàn)對(duì)PPT文件進(jìn)行截圖操作的方法
這篇文章主要介紹了Python實(shí)現(xiàn)對(duì)PPT文件進(jìn)行截圖操作的方法,涉及Python操作幻燈片的相關(guān)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04pandas 強(qiáng)制類型轉(zhuǎn)換 df.astype實(shí)例
這篇文章主要介紹了pandas 強(qiáng)制類型轉(zhuǎn)換 df.astype實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-04-04