python3 numpy中數組相乘np.dot(a,b)運算的規則說明

python np.dot(a,b)運算規則解析

首先我們知道dot運算時不滿足交換律的,np.dot(a, b)與np.dot(b, a)是不一樣的

另外np.dot(a,b)和a.dot(b)果是一樣的

1.numpy中數組相乘np.dot(a,b)運算條件:

對於兩數組a和b :

示例一:

a = np.array([[3], [3], [3]]) # (3,1)
b = np.array([2, 2, 1]) # (3,)
print(a, "\na的shape", a.shape)
print(b, "\nb的shape", b.shape)
c = b.dot(a)
print(c, "\nc的shape", c.shape)

輸出:

 [3]
 [3]] 
a的shape (3, 1)
[2 2 1] 
b的shape (3,)
[15] 
c的shape (1,)

示例二:

a = np.array([[2,2,2,1],[3,3,3,1],[4,4,4,4]]) # shape=(3,4)
b = np.array([[1,1,1],[2,2,2],[3,3,3],[4,4,4]]) # shape=(4,3)

可以直接看他們的shape:a的shape為(3, 4)設為(m, n);b的shape為(4, 3)設為(x, y)

對於上面兩個數組a,b:

np.dot(a,b)的運算條件為:n==x,如果a的shape變為(4, 3)則兩則無法dot

簡單來說規律就是:如果a.shape=(m,n),b.shape=(x,y)那麼**np.dot(a,b)**的運算條件為:n=x (這一點用於在python理解和快速判斷數組的shape是否用對瞭)

實際上數組運算的規律將兩個數組畫出來,是這樣的:

2.np.dot(a,b)運算之後的結果解析

規律:dot之後會將兩組數組中相等的(符合dot條件的)維度消掉,得到剩下的維度組合成新的數組,如果剩下隻有一個維度則為行(對應一維),列是無

對於a.shape=(m,n),b.shape=(x,y):

dot之後n和x會消掉,結果shape變成(m,y)

如果n為1(或者空),shape變為(y,)

e.g1:

a = np.array([1,1,1]) # shape=(3,)
b = np.array([[3],[3],[3]]) # shape=(3,1)
print(np.dot(a,b))
print("dot之後的shape為:", np.dot(a,b).shape)

那麼,3和3消掉,剩下隻有一個數1,對應1行沒有列==>(1,)

運算結果:

[9]
dot之後的shape為:(1,)

e.g2:

a.shape=(4,1) 
b.shape=(1,4)

那麼( 1和1消掉,剩下(4,4) )

np.dot(a,b)的shape為(4,4)

補充:Python3中的列表、數組和矩陣及*、np.dot和np.multiply解析

今天用Python進行數據處理的時候,突然發現自己搞不清Python中的列表和數組有啥區別及其運算規則,總是得不到自己想要的結果。於是就開始在網上找相關資料,發現很多資料講的都十分片面,下面自己總結的各個資料,給大傢進行詳細的解釋:

1.列表、數組和矩陣

列表是Python中最基本的數據結構,列表中可以存儲數字、字符串等,因此Python可以通過列表存儲數組;

數組是Python擴展庫Numpy中的一種數據結構ndarray;

矩陣是同樣是Python擴展庫Numpy中的一種數據結構mat;

那麼既然存在列表,為什麼我們不直接使用Python中的列表,而使用Numpy呢?原因顯然意見,Python中列表的存儲效率和輸入輸出性能遠不及Numpy中的數組和矩陣,但是由於列表中可以存儲任意元素,因此列表的通用性方面要比數組和矩陣強。總之列表與數組、矩陣各有各的優勢,要視使用場合選擇合適的數據結構。

同樣Numpy中的數組和矩陣也是有區別的:

Numpy中的矩陣必須是2維的,而Numpy中數組可以是多維的,因此矩陣是數組的一個特例,所以在Numpy中的矩陣繼承著數組的所有特性;

同時我們常常需要查看列表、數組和矩陣的屬性,如size、shape、len

其中len():返回對象的長度,可以作用於列表、數組和矩陣:len(list([1,2,3]))

size()和shape()是Numpy擴展庫中才用的函數:

size():計算所有數據的個數,同樣可以作用於列表、數組和矩陣:np.size(np.array([1,2,3]))

shape():得到數據每維的大小,同樣可以作用於列表、數組和矩陣:np.shape(np.array([1,2,3]))

不同於len,shape和size還可以作為數組和矩陣的屬性(列表不行),使用方法如下:a.shape、a.size

2.Python中的星號(*)、np.multiply()、np.dot()

1.星號(*):

對數組執行對應位置相乘;對矩陣執行矩陣乘法運算

2.np.multiply()

不管對矩陣還是數組都是執行對應位置相乘

3.np.dot()

對秩為1的數組:對應位置相乘並求和

對秩不為1的數組:矩陣乘法運算

對矩陣:矩陣乘法運算

上面是對列表、數組、矩陣以及Python中各種乘法的總結,果然總結對自己理解問題有很大的幫助,現在自己自己很清楚它們的用法瞭,希望這篇博客也可以幫助大傢~

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。如有錯誤或未考慮完全的地方,望不吝賜教。

推薦閱讀: