NumPy中np.dot與np.matmul對比實(shí)現(xiàn)
一、引言
在科學(xué)計(jì)算和數(shù)據(jù)分析領(lǐng)域,NumPy 是 Python 中一個至關(guān)重要的庫,它提供了高效的多維數(shù)組對象以及對這些數(shù)組進(jìn)行各種操作的函數(shù)。其中,np.dot
和 np.matmul
是兩個常用的用于數(shù)組乘法的函數(shù)。雖然它們都能實(shí)現(xiàn)數(shù)組的乘法運(yùn)算,但在具體的使用場景和行為上存在一些差異。本文將深入對比 np.dot
和 np.matmul
,幫助更好地理解和選擇合適的函數(shù)進(jìn)行數(shù)組乘法運(yùn)算。
二、基本概念與語法
(一)np.dot
np.dot
是 NumPy 中用于計(jì)算兩個數(shù)組點(diǎn)積的函數(shù)。它的語法如下:
np.dot(a, b, out=None)
其中,a
和 b
是要進(jìn)行點(diǎn)積運(yùn)算的數(shù)組,out
是可選參數(shù),用于指定輸出結(jié)果的數(shù)組。
(二)np.matmul
np.matmul
用于執(zhí)行兩個數(shù)組的矩陣乘法。其語法為:
np.matmul(x1, x2, out=None)
同樣,x1
和 x2
是參與矩陣乘法的數(shù)組,out
是可選的輸出數(shù)組。
三、一維數(shù)組的運(yùn)算對比
(一)np.dot
當(dāng) np.dot
用于兩個一維數(shù)組時,它計(jì)算的是兩個數(shù)組的內(nèi)積,即對應(yīng)元素相乘后求和。
import numpy as np a = np.array([1, 2, 3]) b = np.array([4, 5, 6]) result_dot = np.dot(a, b) print(result_dot) # 輸出: 1*4 + 2*5 + 3*6 = 32
(二)np.matmul
對于一維數(shù)組,np.matmul
也計(jì)算內(nèi)積,結(jié)果與 np.dot
相同。
result_matmul = np.matmul(a, b) print(result_matmul) # 輸出: 32
在一維數(shù)組的情況下,np.dot
和 np.matmul
的行為是一致的,都能高效地計(jì)算內(nèi)積。
四、二維數(shù)組的運(yùn)算對比
(一)np.dot
在處理二維數(shù)組時,np.dot
執(zhí)行的是標(biāo)準(zhǔn)的矩陣乘法。即第一個矩陣的行與第二個矩陣的列對應(yīng)元素相乘后求和。
A = np.array([[1, 2], [3, 4]]) B = np.array([[5, 6], [7, 8]]) result_dot_2d = np.dot(A, B) print(result_dot_2d) # 輸出: # [[1*5 + 2*7, 1*6 + 2*8], # [3*5 + 4*7, 3*6 + 4*8]] # 即 [[19, 22], # [43, 50]]
(二)np.matmul
np.matmul
同樣用于二維數(shù)組的矩陣乘法,其結(jié)果與 np.dot
相同。
result_matmul_2d = np.matmul(A, B) print(result_matmul_2d) # 輸出: # [[19, 22], # [43, 50]]
對于二維數(shù)組,np.dot
和 np.matmul
都能正確執(zhí)行矩陣乘法,并且結(jié)果一致。
五、高維數(shù)組的運(yùn)算對比
(一)np.dot
當(dāng)處理高維數(shù)組(維度大于 2)時,np.dot
的行為相對復(fù)雜。它會將最后一個軸與倒數(shù)第二個軸進(jìn)行點(diǎn)積運(yùn)算。
C = np.random.rand(2, 3, 4) D = np.random.rand(2, 4, 5) result_dot_high = np.dot(C, D) print(result_dot_high.shape) # 輸出: (2, 3, 2, 5)
這里,np.dot
會將 C
的最后一個軸(長度為 4)與 D
的倒數(shù)第二個軸(長度為 4)進(jìn)行點(diǎn)積運(yùn)算,得到一個四維數(shù)組。
(二)np.matmul
np.matmul
在處理高維數(shù)組時,會將最后兩個軸視為矩陣,進(jìn)行矩陣乘法,而前面的軸會被廣播。
result_matmul_high = np.matmul(C, D) print(result_matmul_high.shape) # 輸出: (2, 3, 5)
np.matmul
會將 C
和 D
的最后兩個軸分別視為矩陣進(jìn)行乘法,前面的軸(這里是第一個軸,長度為 2)會進(jìn)行廣播,最終得到一個三維數(shù)組。
在高維數(shù)組的情況下,np.dot
和 np.matmul
的行為差異明顯,需要根據(jù)具體需求選擇合適的函數(shù)。
六、與標(biāo)量的運(yùn)算對比
(一)np.dot
np.dot
可以接受一個數(shù)組和一個標(biāo)量作為參數(shù),它會將數(shù)組的每個元素與標(biāo)量相乘。
scalar = 2 E = np.array([[1, 2], [3, 4]]) result_dot_scalar = np.dot(E, scalar) print(result_dot_scalar) # 輸出: # [[2, 4], # [6, 8]]
(二)np.matmul
np.matmul
不支持與標(biāo)量進(jìn)行運(yùn)算,如果傳入標(biāo)量會引發(fā) TypeError
。
try: result_matmul_scalar = np.matmul(E, scalar) except TypeError as e: print(f"Error: {e}")
七、使用建議
(一)根據(jù)數(shù)組維度選擇
- 對于一維和二維數(shù)組,
np.dot
和np.matmul
功能基本相同,可根據(jù)個人習(xí)慣選擇。 - 對于高維數(shù)組,如果需要將最后兩個軸視為矩陣進(jìn)行乘法并廣播前面的軸,建議使用
np.matmul
;如果需要按照特定的軸進(jìn)行點(diǎn)積運(yùn)算,可使用np.dot
。
(二)考慮標(biāo)量運(yùn)算
如果需要對數(shù)組和標(biāo)量進(jìn)行乘法運(yùn)算,應(yīng)使用 np.dot
,因?yàn)?nbsp;np.matmul
不支持標(biāo)量運(yùn)算。
八、總結(jié)
np.dot 和 np.matmul 都是 NumPy 中用于數(shù)組乘法的重要函數(shù),但它們在不同維度數(shù)組和標(biāo)量運(yùn)算上存在差異。在一維和二維數(shù)組的情況下,二者功能相似;而在高維數(shù)組運(yùn)算中,np.matmul 更側(cè)重于矩陣乘法和軸廣播,np.dot 則有其特定的軸點(diǎn)積規(guī)則。同時,np.dot 支持與標(biāo)量的乘法,而 np.matmul 不支持。
到此這篇關(guān)于NumPy中np.dot與np.matmul對比實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)NumPy np.dot np.matmul內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python GUI庫圖形界面開發(fā)之PyQt5 UI主線程與耗時線程分離詳細(xì)方法實(shí)例
這篇文章主要介紹了python GUI庫圖形界面開發(fā)之PyQt5 UI主線程與耗時線程分離詳細(xì)方法實(shí)例,需要的朋友可以參考下2020-02-02Flask框架的學(xué)習(xí)指南之開發(fā)環(huán)境搭建
本文是Flask框架的學(xué)習(xí)指南系列文章的第一篇,主要給大家講述的是開發(fā)環(huán)境的搭建工作,有需要的小伙伴可以參考下2016-11-11Python輸入的多種情況超詳細(xì)解讀(單行、多行及數(shù)組)
對于 Python 來說有多種方式可以輸入數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于Python輸入的多種情況超詳細(xì)解讀,分別是單行、多行及數(shù)組,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-03-03Python+matplotlib實(shí)現(xiàn)繪制等高線圖示例詳解
在matplotlib.pyplot中除了可以繪制常規(guī)圖表如折線、柱狀、散點(diǎn)等,還可以繪制常用在地理上的平面展示地型的等高線圖,本文主要為大家介紹了如何利用matplotlib繪制等高線圖,需要的可以參考一下2021-12-12