NumPy - 高階索引



可以從 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 'Our array is:' 
print x 
print '\n' 

rows = np.array([[0,0],[3,3]])
cols = np.array([[0,2],[0,2]]) 
y = x[rows,cols] 
   
print 'The corner elements of this array are:' 
print y

此程式的輸出如下所示:

Our array is:                                                                 
[[ 0  1  2]                                                                   
 [ 3  4  5]                                                                   
 [ 6  7  8]                                                                   
 [ 9 10 11]]
 
The corner elements of this array are:                                        
[[ 0  2]                                                                      
 [ 9 11]] 

結果選擇是一個包含角元素的 ndarray 物件。

高階索引和基本索引可以透過使用一個切片 (:) 或省略號 (…) 與索引陣列相結合。以下示例對行使用切片,對列使用高階索引。當對兩者都使用切片時,結果相同。但是高階索引會導致複製,並且可能具有不同的記憶體佈局。

示例 3

import numpy as np 
x = np.array([[ 0,  1,  2],[ 3,  4,  5],[ 6,  7,  8],[ 9, 10, 11]]) 

print 'Our array is:' 
print x 
print '\n'  

# slicing 
z = x[1:4,1:3] 

print 'After slicing, our array becomes:' 
print z 
print '\n'  

# using advanced index for column 
y = x[1:4,[1,2]] 

print 'Slicing using advanced index for column:' 
print y

此程式的輸出如下所示:

Our array is:
[[ 0  1  2] 
 [ 3  4  5] 
 [ 6  7  8]
 [ 9 10 11]]
 
After slicing, our array becomes:
[[ 4  5]
 [ 7  8]
 [10 11]]

Slicing using advanced index for column:
[[ 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 'Our array is:' 
print x 
print '\n'  

# Now we will print the items greater than 5 
print 'The items greater than 5 are:' 
print x[x > 5]

此程式的輸出將是:

Our array is: 
[[ 0  1  2] 
 [ 3  4  5] 
 [ 6  7  8] 
 [ 9 10 11]] 
 
The items greater than 5 are:
[ 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] 
廣告