NumPy高級索引

NumPy - 高級索引

如果一個ndarray是非元組序列,數據類型爲整數或布爾值的ndarray,或者至少一個元素爲序列對象的元組,我們就能夠用它來索引ndarray。高級索引始終返回數據的副本。 與此相反,切片只提供了一個視圖。

有兩種類型的高級索引:整數和布爾值。

整數索引

這種機制有助於基於 N 維索引來獲取數組中任意元素。 每個整數數組表示該維度的下標值。 當索引的元素個數就是目標ndarray的維度時,會變得相當直接。

以下示例獲取了ndarray對象中每一行指定列的一個元素。 因此,行索引包含所有行號,列索引指定要選擇的元素。

示例 1

import numpy as np 

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

輸出如下:

[1  4  5]

該結果包括數組中(0,0)(1,1)(2,0)位置處的元素。

下面的示例獲取了 4X3 數組中的每個角處的元素。 行索引是[0,0][3,3],而列索引是[0,2][0,2]

示例 2

import numpy as np 
x = np.array([[  0,  1,  2],[  3,  4,  5],[  6,  7,  8],[  9,  10,  11]])  
print  '我們的數組是:'  
print x 
print  '\n' 
rows = np.array([[0,0],[3,3]]) 
cols = np.array([[0,2],[0,2]]) 
y = x[rows,cols]  
print  '這個數組的每個角處的元素是:'  
print y

輸出如下:

我們的數組是:                                                                 
[[ 0  1  2]                                                                   
 [ 3  4  5]                                                                   
 [ 6  7  8]                                                                   
 [ 9 10 11]]

這個數組的每個角處的元素是:                                      
[[ 0  2]                                                                      
 [ 9 11]]

返回的結果是包含每個角元素的ndarray對象。

高級和基本索引可以通過使用切片:或省略號...與索引數組組合。 以下示例使用slice作爲列索引和高級索引。 當切片用於兩者時,結果是相同的。 但高級索引會導致複製,並且可能有不同的內存佈局。

示例 3

import numpy as np 
x = np.array([[  0,  1,  2],[  3,  4,  5],[  6,  7,  8],[  9,  10,  11]])  
print  '我們的數組是:'  
print x 
print  '\n'  
# 切片
z = x[1:4,1:3]  
print  '切片之後,我們的數組變爲:'  
print z 
print  '\n'  
# 對列使用高級索引 
y = x[1:4,[1,2]] 
print  '對列使用高級索引來切片:'  
print y

輸出如下:

我們的數組是:
[[ 0  1  2] 
 [ 3  4  5] 
 [ 6  7  8]
 [ 9 10 11]]

切片之後,我們的數組變爲:
[[ 4  5]
 [ 7  8]
 [10 11]]

對列使用高級索引來切片:
[[ 4  5]
 [ 7  8]
 [10 11]]

布爾索引

當結果對象是布爾運算(例如比較運算符)的結果時,將使用此類型的高級索引。

示例 1

這個例子中,大於 5 的元素會作爲布爾索引的結果返回。

import numpy as np 
x = np.array([[  0,  1,  2],[  3,  4,  5],[  6,  7,  8],[  9,  10,  11]])  
print  '我們的數組是:'  
print x 
print  '\n'  
# 現在我們會打印出大於 5 的元素  
print  '大於 5 的元素是:'  
print x[x >  5]

輸出如下:

我們的數組是:
[[ 0  1  2] 
 [ 3  4  5] 
 [ 6  7  8] 
 [ 9 10 11]] 

大於 5 的元素是:
[ 6  7  8  9 10 11]

示例 2

這個例子使用了~(取補運算符)來過濾NaN

import numpy as np 
a = np.array([np.nan,  1,2,np.nan,3,4,5])  
print a[~np.isnan(a)]

輸出如下:

[ 1.   2.   3.   4.   5.]

示例 3

以下示例顯示如何從數組中過濾掉非複數元素。

import numpy as np 
a = np.array([1,  2+6j,  5,  3.5+5j])  
print a[np.iscomplex(a)]

輸出如下:

[2.0+6.j  3.5+5.j]