Numpy常用概念-對象的副本和視圖、向量化、廣播機制
阿新 • • 發佈:2017-12-11
一維數組 運算 shape nbsp 兼容性 需要 for numpy 方式
一、引言
在我們操作數組的時候,返回的是新數組還是原數組的鏈接,我們就需要了解對象副本和視圖的區別。
向量化和廣播是numpy內部實現的基礎。
二、對象副本和視圖
我們應該註意到,在操作數組的時候返回的不是視圖就是副本。
副本:復制
視圖:鏈接
1.所有的賦值運算不會為此創建副本。把數組a賦值給了數組b,實際上不是為數組a創建副本,b只是調用a的另一種方式。實際上,修改了b數組的第二個元素,a數組的第二個數組也隨之被改變。
In [1]: a = np.array([1,2,3,4,5]) In [2]: a Out[2]: array([1, 2, 3, 4, 5]) In [3]: b = a In [4]: b Out[4]: array([1, 2, 3, 4, 5]) #修改b數組的第二個元素,a數組的第二個元素也隨即改變 In [5]: b[1] = 6 In [6]: a Out[6]: array([1, 6, 3, 4, 5])
2.切片操作得到的結果也是指向相同的對象。
In [9]: c = a[0:2] In [10]: c Out[10]: array([1, 6]) In [11]: c[0] = 5 In [12]: a Out[12]: array([5, 6, 3, 4, 5])
3.為數組創建副本,使用copy()
In [12]: a Out[12]: array([5, 6, 3, 4, 5]) In [13]: a = np.array([1,2,3,4]) In [14]: d = a.copy() In [15]: d Out[15]: array([1, 2, 3, 4]) In [16]: d[0] = 5 #數組d元素的改變並不會影響數組a In [17]: a Out[17]: array([1, 2, 3, 4])
三、向量化
有了向量化,編寫code時無需使用循環,因為他在內部已經實現了。向量化使得代碼更簡潔,可讀性更強。
數組相乘可以:a * b 而不需要for遍歷數組相乘。
四、廣播機制
1、廣播機制實現了對兩個或以上數組的運算或函數處理,即使這些數組的形狀或長短不完全相同。
2、廣播機制條件(滿足其一即可):1.兩個數組的每一維等長 2.其中一個數組為一維數組
3、廣播機制有兩條規則:
1)為確實的維度補上個1.如果這時滿足了兼容性條件,就可以使用廣播機制了。
2)擴展最小數組,使得它與最大的數組大小相同,以便使用元素級的函數或運算符。
In [17]: a = np.array([1,2,3]) Out[17]: array([1, 2, 3,]) In [18]: b = np.arange(0,9).reshape(3,3) In [19]: b Out[19]: array([[0, 1, 2], [3, 4, 5], [6, 7, 8]]) #假定為數組a用已有的值進行了填充 #array([[1, 2, 3,], # [1, 2, 3,], # [1, 2, 3,]]) In [20]: a+b Out[20]: array([[1, 3, 5], [4, 6, 8], [7, 9, 11]])
假定(一維數組)使用了原有的值填充,使得與另一個數組維度相同,他們的值就可以相加了。
即使更復雜的數組,兩個數組形狀不同、維度不同、互有長短。也仍然相互兼容,因此廣播規則仍然適用。
In [21]: m = np.arange(6).reshape(3,1,2) In [22]: n = np.arange(6).reshape(3,2,1) In [23]: m Out[23]: array([[[0, 1]], [[2, 3]], [[4, 5]]]) In [24]: n Out[24]: array([[[0], [1]], [[2], [3]], [[4], [5]]]) In [26]: m + n Out[26]: array([[[ 0, 1], [ 1, 2]], [[ 4, 5], [ 5, 6]], [[ 8, 9], [ 9, 10]]])
Numpy常用概念-對象的副本和視圖、向量化、廣播機制