1. 程式人生 > >Numpy常用概念-對象的副本和視圖、向量化、廣播機制

Numpy常用概念-對象的副本和視圖、向量化、廣播機制

一維數組 運算 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常用概念-對象的副本和視圖、向量化、廣播機制