NumPy 學習 第二篇:索引和切片


數組索引是指使用中括號 [] 來定位數據元素,不僅可以定位到單個元素,也可以定位到多個元素。索引基於0,並接受從數組末尾開始索引的負索引。

舉個例子,正向索引從0開始,從數組開始向末尾依次加1遞增;負向索引從-1開始,逐個元素 -1 ,不管使用正向索引還是負向索引,最右側的元素的索引值是最大的,最左側的元素的索引值是最小的。

>>> x = np.arange(10)
>>> x[2] 2 >>> x[-2] 8

一,單個元素的索引

ndarray對象的元素可以通過索引來訪問和修改,索引基於0。要定位到單個元素,對於一維數組,只需要一個索引;對於二維數組,需要兩個維度的索引。

1,一維數組的索引

一維數組最簡單,只有一個維度,中括號中只有一個索引idx,正向索引idx 從0開始,負向索引從-1開始:

arr = np.arange(10)

arr[idx]

2,二維數組的索引

在一個二維數組中,一個索引位置上的元素不再是標量,而是一維數組。要索引到單個標量元素,需要在中括號中分別指定行維度和列維度的索引,索引都是從0開始:

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

>>> arr2d[2]
# array([7,8,9])
>>> arr2d[0][2]
#3
>>> arr2d[0,2]
#3

對於更高維度的數組,一個中括號表示一個維度,索引的使用依此類推。

二,數組的切片

數組的切片是Python基本切片的概念從一維到N維的擴展,通過中括號,start,stop和step參數提供給內置函數的slice函數來構造一個Python slice對象,把slice對象傳遞給數組,提取數組的一部分。

1,切片的格式

切片的格式是[start:end:step],如果省略start,使用start的默認值0;如果省略end,那么end的默認值是 維度長度-1;如果省略step,使用step的默認值1。通常情況下,數組的切片是[start:end],這就意味着使用step的默認值1。

arr = np.array(n)
arr[start:end]
arr[start:end:step]

2,淺拷貝(視圖)

數組切片是原始數組的淺拷貝,也叫視圖,修改切片中的原始,會直接修改原始數據。

對於一維數組,數組切片上的任何修改都會直接修改原始數組:

arr = np.arange(10)
arr_slice=arr[5:8]
arr_slice[1]=111
#arr=array([0,1,2,3,4,5,111,7,8,9])

arr_slice[:]=222
#arr=array([0,1,2,3,4,222,222,222,8,9])

對於二維數組,一個中括號表示一個維度,依此類推。

>>> y = np.arange(35).reshape(5,7)
>>> y[1:5:2,::3] array([[ 7, 10, 13], [21, 24, 27]])

4,深拷貝(副本)

調用copy()方法對數組創建一個深拷貝,也叫副本,深拷貝是生成數組及其數據的完整副本。

例如,b是a的深拷貝,修改數組a不會影響數組b:

b = a.copy()

三,索引數組

NumPy數組可以使用其他數組(或任何其他可以轉換為數組的類似序列的對象,如列表,除元組之外的索引)作為索引。對於索引數組的所有情況,返回的是原始數據的副本(深拷貝),而不是切片獲取的視圖。

索引數組必須是整數類型。數組中的每個值指示要使用的數組中的哪個值代替索引:

>>> x = np.arange(10,1,-1)
>>> x array([10, 9, 8, 7, 6, 5, 4, 3, 2]) >>> x[np.array([3, 3, 1, 8])] array([7, 7, 9, 2])

由值3,3,1和8組成的索引數組相應地創建一個長度為4的數組(與索引數組相同),其中每個索引由索引數組在被索引的數組中具有的值替換。

允許使用負值,並且與單個索引或切片一樣工作:

>>> x[np.array([3,3,-3,8])]
array([7, 7, 4, 2])

一般來說,使用索引數組時返回的是與索引數組具有相同形狀的數組,但索引的數組的類型和值。作為示例,我們可以使用多維索引數組:

>>> x[np.array([[1,1],[2,3]])]
array([[9, 9], [8, 7]])

四,掩碼索引數組

如果索引數組的元素類型是布爾,把該索引數組稱作布爾或掩碼索引數組。整數索引數組,元素是數組的索引值,而對於掩碼索引數組,元素值是True或False,掩碼索引數組和數據數組的形狀相同,一個掩碼索引對應一個數據數組的元素。當掩碼為True時,選擇該位置對應的元素;當掩碼為False,忽略該位置對應的元素。

>>> b = y>20
>>> y[b]
array([21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34])

 

 

參考文檔:

NumPy 索引


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM