2020-10-22

Moana11發表於2020-10-22

1、副本與檢視

副本是一個資料的完整的拷貝,如果我們對副本進行修改,它不會影響到原始資料,實體記憶體不在同一位置

檢視是資料的一個別稱或引用,通過該別稱或引用亦便可訪問、操作原有資料,但原有資料不會產生拷貝。如果我們對檢視進行修改,它會影響到原始資料,實體記憶體在同一位置

  • 檢視一般發生在:
    1、numpy 的切片操作返回原資料的檢視。
    2、呼叫 ndarray 的 view() 函式產生一個檢視。

  • 副本一般發生在:
    1、Python 序列的切片操作,呼叫deepCopy()函式。
    2、呼叫 ndarray 的 copy() 函式產生一個副本。

1.1 無複製

所有賦值運算不會為陣列和陣列中的任何元素建立副本。 相反,它使用原始陣列的相同id()來訪問它。 id()返回 Python 物件的通用識別符號,類似於 C 中的指標。

import numpy as np
x=np.array([1,2,3,4,5,6])
y=x
y[0]=-2
print(x)
print(y)

此外,一個陣列的任何變化都反映在另一個陣列上。 例如,一個陣列的形狀改變也會改變另一個陣列的形狀。

1.2 檢視或淺拷貝

ndarray.view() 方會建立一個新的陣列物件,該方法建立的新陣列的維數更改不會更改原始資料的維數。

1.3 副本或深拷貝

ndarray.copy() 函式建立一個副本。 對副本資料進行修改,不會影響到原始資料,它們實體記憶體不在同一位置。

import numpy as np
x=np.array([1,2,3,4,5,6])
y=x.copy()
y[0]=-2
print(x)
print(y)

https://www.runoob.com/numpy/numpy-copies-and-views.html

2、索引與切片

ndarray物件的內容可以通過索引或切片來訪問和修改,與 Python 中 list 的切片操作一樣。

ndarray 陣列可以基於 0 - n 的下標進行索引,切片物件可以通過內建的 slice 函式,並設定 start, stop 及 step 引數進行,從原陣列中切割出一個新陣列。

陣列索引機制指的是用方括號([])加序號的形式引用單個陣列元素,它的用處很多,比如抽取元素,選取陣列的幾個元素,甚至為其賦一個新值。

2.1 整數索引

要獲取陣列的單個元素,指定元素的索引即可。

import numpy as np

x = np.array([1, 2, 3, 4, 5, 6, 7, 8])
print(x[2])  

x = np.array([[11, 12, 13, 14, 15],
              [16, 17, 18, 19, 20],
              [21, 22, 23, 24, 25],
              [26, 27, 28, 29, 30],
              [31, 32, 33, 34, 35]])
print(x[3])  
print(x[2][1])  
print(x[2, 1])  

2.2 切片索引

切片操作是指抽取陣列的一部分元素生成新陣列。對 python 列表進行切片操作得到的陣列是原陣列的副本,而對 Numpy 資料進行切片操作得到的陣列則是指向相同緩衝區的檢視

如果想抽取(或檢視)陣列的一部分,必須使用切片語法,也就是,把幾個用冒號( start:stop:step )隔開的數字置於方括號內。

為了更好地理解切片語法,還應該瞭解不明確指明起始和結束位置的情況。如省去第一個數字,numpy 會認為第一個數字是0;如省去第二個數字,numpy 則會認為第二個數字是陣列的最大索引值;如省去最後一個數字,它將會被理解為1,也就是抽取所有元素而不再考慮間隔。