python编程中的小问题汇总
前言
本文記錄了我在python編程中遇到的各種小問題,持續更新。
1. x = x + 1 VS x += 1
辨析下面這兩段代碼:
>>> x = y = [1, 2, 3, 4] >>> x += [4] >>> x [1, 2, 3, 4, 4] >>> y [1, 2, 3, 4, 4] >>> x = y = [1, 2, 3, 4] >>> x = x + [4] >>> x [1, 2, 3, 4, 4] >>> y [1, 2, 3, 4]1)’+=’ 調用 in-place 的加法,即 iadd 方法。 此方法采用兩個參數,但是原地進行更改,修改了第一個參數的內容(即x被修改)。 由于x和y都指向相同的Pyobject,因此它們都是相同的。
2)x = x + [4] 調用 add 方法,相當于 x.add([4]),并沒有原地進行更改或添加值,它會創建一個新列表[1, 2, 3, 4, 4],該列表指向了x,而y仍指向舊列表[1, 2, 3, 4],因此它們不相同。
2. np.matmul(@) VS np.dot VS np.multiply(*)
np.matmul(a, b)是矩陣乘法,運算符重載為@;np.dot(a, b)是點積;np.multiply(a, b)是逐元素乘法,運算符重載為*
關于三者的辨析,直接上結論:
1)如果a或者b有一個是標量,用np.multiply()或者*,np.dot()可以但不推薦,np.matmul()不可以;
2)如果a、b是向量,則使用np.dot()向量內積;
3)如果a、b是二維array(矩陣),則使用np.matmul()矩陣乘法;
4)a、b是二維及以下array的情況下,np.matmul()與np.dot()效果相同;
5)a、b是大于二維array的情況下,如下例:
a = np.array([i for i in range(120)]).reshape([2,3,4,5]) b = np.array([i for i in range(120)]).reshape([2,3,5,4]) >>> np.matmul(a,b).shape (2, 3, 4, 4)>>> np.dot(a,b).shape (2, 3, 4, 2, 3, 4)>>> np.matmul(b,a).shape (2, 3, 5, 5)>>> np.dot(a,b).shape (2, 3, 5, 2, 3, 5)重點是觀察結果的維度不同,np.matmul(a,b)的維度為(2, 3, 4, 4),np.dot(a,b)的維度為(2, 3, 4, 2, 3, 4),這是因為np.matmul()遵循了矩陣乘法的維度規則(n,k),(k,m)->(n,m),a的最后一個維度5和b的倒數第二個維度5消掉。
具體的運算,用一個簡單點的例子說明:
a = np.array([i for i in range(12)]).reshape([2,2,3]) b = np.array([i for i in range(12)]).reshape([2,3,2]) """ a [[[ 0 1 2][ 3 4 5]][[ 6 7 8][ 9 10 11]]] b [[[ 0 1][ 2 3][ 4 5]][[ 6 7][ 8 9][10 11]]] """>>> np.matmul(a,b) array([[[ 10, 13],[ 28, 40]],[[172, 193],[244, 274]]])>>> np.dot(a,b) array([[[[ 10, 13],[ 28, 31]],[[ 28, 40],[100, 112]]],[[[ 46, 67],[172, 193]],[[ 64, 94],[244, 274]]]])?
3. “==” VS “is”
在python中,雙等號 == 和 is 好像都是用于判斷兩個東西是否相等,但實際上兩者是不一樣的。
== 是用于判斷值(value)相等,即判斷兩個對象是否具有相同的值。
is 是用于判斷參考(reference)相等,即判斷兩個引用是否引用同一個對象。
實際上,以下兩條語句是等價的:
a is b id(a) == id(b)id() 函數可以理解為一種哈希函數,用來唯一標識python中的不可變類型。
總結
以上是生活随笔為你收集整理的python编程中的小问题汇总的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: win7电脑突然花屏死机的几种原因和快速
- 下一篇: 电脑硬件配置知识介绍