亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

高級索引

Numpy 比一般的 Python 序列提供更多的索引方式。除了前面章節介紹的用整數和切片的索引外,本節深入介紹布爾型索引和花式索引。

1. 布爾型索引

在前面的章節,我們簡單介紹了,可以通過一個布爾數組來索引目標數組。

1.1 比較運算符與布爾型數組

在實際使用中,可以通過比較運算符來產生一個布爾型數組。

案例

利用random模塊產生一個大小為7×4的隨機數數組:

data = np.random.randn(7,4)
data
out:
    array([[-0.79578969, -0.73156773,  0.60648318, -0.57213653],
       [ 0.03461754, -0.91921724, -1.51730244,  0.68583205],
       [-0.0584198 , -0.92494003, -0.08106442, -1.44821654],
       [-0.76501214,  2.01128245,  1.0350961 ,  0.81014769],
       [-0.71850433, -1.613115  , -0.23420344,  0.61378525],
       [-1.06667762,  1.11845542,  1.68075202,  0.25989931],
       [-0.80773979, -0.37137009,  0.45941405, -0.57604566]])

定義一個名稱數組,長度為7,并假設上述data中的每一行與名稱數組中的名字一一對應。

names = np.array(['Ben','Tom','Ben','Jeremy','Jeremy','Tom','Ben'])
names
out:
    array(['Ben', 'Tom', 'Ben', 'Jeremy', 'Jeremy', 'Tom', 'Ben'], dtype='<U6')

對data數組,通過傳入一個比較運算符,可以與全部元素逐一比較:

data > 0
out:
    array([[False, False,  True, False],
       [ True, False, False,  True],
       [False, False, False, False],
       [False,  True,  True,  True],
       [False, False, False,  True],
       [False,  True,  True,  True],
       [False, False,  True, False]])

對同樣大小的布爾型數組,可以利用&(和)、|(或)、-(非)進行運算。

例如對data進行-1~1之間的判斷:

(data>-1) & (data < 1)
out:
    array([[ True,  True,  True,  True],
       [ True,  True, False,  True],
       [ True,  True,  True, False],
       [ True, False, False,  True],
       [ True, False,  True,  True],
       [False, False, False,  True],
       [ True,  True,  True,  True]])

1.2 比較運算符與布爾型索引

先利用比較運算符創建布爾型數組,再利用布爾型索引的功能,可以快速進行篩選。

案例

names中的每一個名字,和data的每一行是一一對應的關系。因此可以快速地選擇出Ben的相關信息:

data[names=='Ben']
out:
    array([[-0.79578969, -0.73156773,  0.60648318, -0.57213653],
       [-0.0584198 , -0.92494003, -0.08106442, -1.44821654],
       [-0.80773979, -0.37137009,  0.45941405, -0.57604566]])

利用‘&’運算符,一次性選擇出Ben和Tom的相關信息

data[(names=='Ben') | (names=='Tom')]
out:
    array([[-0.79578969, -0.73156773,  0.60648318, -0.57213653],
       [ 0.03461754, -0.91921724, -1.51730244,  0.68583205],
       [-0.0584198 , -0.92494003, -0.08106442, -1.44821654],
       [-1.06667762,  1.11845542,  1.68075202,  0.25989931],
       [-0.80773979, -0.37137009,  0.45941405, -0.57604566]])

布爾型數組也可以和切片、整數索引混合使用:

array([[-0.79578969, -0.73156773],
       [ 0.03461754, -0.91921724],
       [-0.0584198 , -0.92494003],
       [-1.06667762,  1.11845542],
       [-0.80773979, -0.37137009]])

特別地,也可以利用data本身,快速選擇出大于0的元素:

data[data > 0]
out:
    array([0.60648318, 0.03461754, 0.68583205, 2.01128245, 1.0350961 ,
       0.81014769, 0.61378525, 1.11845542, 1.68075202, 0.25989931,
       0.45941405])

這里選擇的結果是以一維數組的形式返回的。

2. 花式索引

花式索引是一個Numpy術語,是指利用整數數組進行索引。

2.1 使用一維整型數組作為索引

對于使用一維整型數組作為索引,如果目標是一維數組,那么索引的結果就是對應位置的元素;如果目標是二維數組,那么就是對應下標的行。

案例

對于上述案例中的names數組,通過傳入一個特定順序的整數列表(或ndarray),來按照指定順序選取元素:

names[[4,3,2,1]]
out:
    array(['Jeremy', 'Jeremy', 'Ben', 'Tom'], dtype='<U6')

如果使用負數,則會從末尾開始選取:

names[[-1,-2,-3,-4]]
out:
    array(['Ben', 'Tom', 'Jeremy', 'Jeremy'], dtype='<U6')

案例

同樣地,對data二維數組,通過傳入特定順序的整數列表,來按照指定順序選取行:

data[[3,1]]
out:
    array([[-0.76501214,  2.01128245,  1.0350961 ,  0.81014769],
       [ 0.03461754, -0.91921724, -1.51730244,  0.68583205]])

2.2 傳入多組索引序列

一次性傳入多個索引數組,這種情況會有一些特殊,其返回的是一個一維數組,其中的元素對應各個索引元祖。

案例

data[[3,1,2],[0,2,1]]
out:
    array([-0.76501214, -1.51730244, -0.92494003])

一次性傳入兩個列表:[3,1,2]、[0,2,1],最終選取出三個元素,其在data數組中的位置分別是(3, 0)、(1, 2)、(2, 1)。并沒有和切片索引一樣,返回一個矩形區域。

那么如何能夠索引矩形區域呢?

案例

下面是得到矩形區域的一個這種的辦法:

data[[3,1,2]][:,[0,2,1]]
out:
    array([[-0.76501214,  1.0350961 ,  2.01128245],
       [ 0.03461754, -1.51730244, -0.91921724],
       [-0.0584198 , -0.08106442, -0.92494003]])

另外,需要記住一個結論是:花式索引和切片不一樣,它總是將數據復制到一個新的數組中。

3. 小結

本節介紹了兩種較為復雜的索引:布爾型索引和花式索引。布爾型索引中,通過與比較運算符連用,可以快速基于判斷邏輯,篩選出指定數據?;ㄊ剿饕齽t是一種應用不多,但是較為特殊的索引,需要了解。