更新時間:2022-10-27 來源:黑馬程序員 瀏覽量:
除了整數索引之外,NumPy中還提供了兩個形式比較復雜的索引——花式索引和布爾索引,下面對這兩種索引的基本用法進行詳細的講解。
1.花式索引
花式索引指以整數組成的數組或列表為索引。當使用花式索引訪問一維數組時,程序會將花式索引對應的數組或列表的元素作為索引,依次根據各個索引獲取對應位置的元素,并將這些元素以數組的形式返回;當使用花式索引訪問二維數組時,程序會將花式索引對應的數組或列表的元素作為索引,依次根據各個索引獲取對應位置的一行元素,并將這些行元素以數組的形式返回。接下來,創(chuàng)建一個一維數組,使用花式索引獲取該數組的多個元素,代碼如下。
In []: import numpy as np array_ld = np.arange (1, 10) print (array_1d) print("- 訪問索引為[2,5,8]的元素 print (array_1d[[2, 5, 8]]) [1 2 3 45 6 7 8 9] ____________ [36 9]以上代碼首先創(chuàng)建了一個一維數組array_ld,然后使用花式索引[2.5.8]訪問了該一維數組,即依次獲取索引2、5、8對應的元素3、6、9.并返回包含這幾個元素的數組。由輸出結果可知,程序輸出了一個包含3、6、9這3個元素的數組,說明使用花式索引成功地一次訪問了數組中的多個元素。
接下來,創(chuàng)建一個二維數組,使用花式索引獲取該數組的多行元素,代碼如下。
In []: array_2d - np.arange (1, 10).reshape((3, 3)) print (array_2d) print("_______________") # 訪問索引為[0,2]的元素 print(array_2d[[0, 2]]) [[1 2 3] [4 5 6] [7 8 9]] [[1 2 3] [7 8 9]]
需要說明的是,在使用兩個花式索引,即通過“二維數組[花式索引,花式索引]”的形式訪問數組時,會將第一個花式索引對應數組或列表的各元素作為行索引,將第二個花式索引對應數組或列表的各元素作為列索引,再按照“二維數組[行索引,列索引]”的形式獲取對應位置的元素。例如,使用兩個花式索引訪問二維數組array_2d的元素,代碼如下。
In 1]: #使用兩個花式索引訪問元素 print (array_2d[[0, 2], [1, 1]]) [2 8]
上述與二維數組相關的花式索引操作的示意圖如下圖所示。
花式索引操作示意圖
2.布爾索引
布爾索引是以布爾值構成的數組為索引。當使用布爾索引訪問一個目標數組時,程序會將布爾數組中的每個布爾值作為索引,只要布爾值為True,就從目標數組中獲取與True位置對應的元素。需要說明的是,布爾數組的形狀必須與目標數組的形狀相同。接下來,創(chuàng)建一個二維數組,獲取該數組中值大于5的元素,代碼如下。
In []: array_2d = np.arange (1, 10).reshape ((3, 3)) print(array_2d) print("-_______--") 使用布爾索引訪問元素 print (array_2d > 5) print("----------") print (array_2d[array_2d > 5]) [{1 2 3] [4 5 6] [7 8 9]} ---------- [[False False Falce] [False False Truf [ True True True]} ---------- [6 7 8 9]
以上代碼中,首先創(chuàng)建了一個形狀為(3,3)的二維數組array_2d,該數組中的元素為1~9;然后將array_2d數組進行布爾運算,判斷array_2d中的每個元素是否都大于5.大于5會得到布爾值 Tnue,小于5會得到布爾值False,所有的布爾值構成一個形狀與array_2d數組相同的布爾數組;最后將這個布爾數組作為布爾索引,通過布爾索引獲取array_2d數組中的元素。從輸出的結果可以看出,程序返回了array_2d數組中與布爾數組中Tnue位置對應的元素。
上述二維數組相關的布爾索引操作的示意圖如圖2-4所示。
布爾索引示意圖